2014-11-28 2 views
1

RMI에서 JMX 인증을 구현하기 위해 JMXAuthenticator을 구현했지만 읽기 전용/읽기 쓰기 액세스 수준을 허용하는 역할을 만드는 방법을 모르겠습니다. 예를 들어, JMXAuthenticator.authenticate에 사용자 정의 인증 논리가 있으며 액세스 역할을 결정하기를 원합니다. 나는 다음을 시도했지만 그것은 JConsole의에서 작업을 수행 차이도하지 않습니다 :JMX 인증 - 역할 기반 MBean 작업

adminuser readwrite 
basicuser readonly 

com.sun.management.jmxremote.access.file=PATH TO ACCESS FILE을 포함 jmx.management.properties을 포함,

@Override 
public Subject authenticate(Object credentials) { 
    Subject subject = new Subject(); 
    JMXPrincipal p; 

    //...my logic 
    String accessLevel = myCustomLogic(); 
    if (accessLevel.equals("admin")) { 
     p = new JMXPrincipal("adminrole"); 
    } else { 
     p = new JMXPrincipal("basicrole"); 
    } 

    subject.getPrincipals().add(p); 
    return subject; 
} 

그때 액세스 파일, jmxaccess.properties을 만들었을하고 난을 실행 응용 프로그램은 -Dcom.sun.management.config.file=PATH TO jmx.management.properties입니다.

그러나 JConsole을 통해 연결하고 기본 사용자 (읽기 전용 액세스)로 인증하면 bean의 setter에 액세스 할 수 있습니다. 전체 service:jmx:rmi:... URL을 통해 연결 중입니다.

그래서 제 질문은

  • 내가/주석에만 관리자 사용자로 볼을 지정하는 내 콩의 세터에 아무것도 할 필요가 있는가인가?
  • JMXAuthenticator이 반환하는 Subject 개체를 올바르게 작성하지 않았습니까?
  • 다른 구성/설정이 누락 되었습니까?

감사

편집 내 MBean의

공공 getter 및 setter 더하기 하나 개는 다른 공공 방법이 개인 필드 단지 기본적인 POJO이다.

답변

1

대답을 찾았습니다 : InvocationHandler 인터페이스를 통해 사용자 정의 호출 처리기를 구현해야합니다. 이것은 서버 호출이 빈에 도달하기 전에 인터셉트합니다. 인증 용 방법 내부는 원칙

AccessControlContext acc = AccessController.getContext(); 
Subject subject = Subject.getSubject(acc); 
Set principals = subject.getPrincipals(JMXPrincipal.class); 
if(principals != null && !principals.isEmpty()) { 
    Principal principal = (Principal)principals.iterator().next(); 
    //your checks 
} 

내가의 JMXPrincipal (액세스 레벨 당 하나의 확장)를 확장하고 위의 인증 자에 제목에 할당

를 확인해야 다음 IH의 주체를 검색 한 후, 나는 확인하실 수 있습니다 유형은 instanceof을 통해 이루어지며 조치를 계속하거나 SecurityException을 던지십시오.