2014-11-28 2 views
1

Я реализовал JMXAuthenticator для аутентификации JMX через RMI, однако я не уверен, как создавать роли, позволяющие уровни доступа для чтения/чтения. Например, в JMXAuthenticator.authenticate у меня есть пользовательская логика проверки подлинности и хочу, чтобы это определяло роль доступа. Я попытался следующие, но это не имеет никакого значения при выполнении операций в JConsole:Аутентификация JMX - операции MBean на основе ролей

@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, содержащий

adminuser readwrite 
basicuser readonly 

и jmx.management.properties, который содержит com.sun.management.jmxremote.access.file=PATH TO ACCESS FILE и я бегу приложение с -Dcom.sun.management.config.file=PATH TO jmx.management.properties.

Однако, когда я подключаюсь через JConsole и аутентифицируюсь как basicuser (доступ только для чтения), я могу получить доступ к сеттерам в компоненте. Я подключаюсь через полный адрес service:jmx:rmi:....

Так что мои вопросы

  • мне нужно аннотировать/сделать что-нибудь для сеттеров в моем компоненте, чтобы указать их как видимый только пользователям администратора делать?
  • Я не строю Subject объект, который возвращает JMXAuthenticator?
  • Отсутствует какая-либо другая конфигурация/настройка?

Благодаря

Редактировать Мой MBean только основные POJO с частными полями, которые имеют государственные методы получения и установки, плюс еще один публичный метод.

ответ

1

Нашел ответ: необходимо реализовать пользовательский обработчик вызова через интерфейс InvocationHandler. Это перехватывает вызовы сервера, прежде чем они достигнут боба. Внутри метода AUTHENTICATE вы должны проверить принципал

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 (один удлинитель на уровень доступа) и назначил его субъект в указанном выше Authenticator, то после извлечения основного долга в IH, я могу проверить тип через instanceof и либо разрешить действие продолжить, либо выбросить SecurityException.

Смежные вопросы