аутентификатор Spring Security JMX

У меня есть сервер JMX, настроенный без Spring, и я пытаюсь реализовать Spring Security для части авторизации. (См. здесь, https://blogs.oracle.com/lmalventosa/entry/jmx_authentication_authorization. Вариант использования 4, без части авторизации)

Теперь я хотел бы реализовать часть авторизации с помощью Spring Security.

В моем аутентификаторе JMX я делаю:

final List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
roles.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
final Authentication auth = new UsernamePasswordAuthenticationToken(credentialsArr[0], credentialsArr[1],
                        roles);
SecurityContextHolder.getContext().setAuthentication(auth);

И в MBeans я пытаюсь получить его и вижу, что он был передан правильно (в будущем я планирую добавить Spring Annotations для проверки ролей, для вызова метода).

final Authentication springAuth = SecurityContextHolder.getContext().getAuthentication();

Проблема в том, что в стандартном потоке подключения:

JMXServiceURL url = ...;
Map env = ...;
String[] creds = {"monitorRole", "mrpasswd", "FileRealm"};
env.put(JMXConnector.CREDENTIALS, creds);
JMXConnector cc = JMXConnectorFactory.connect(url, env);
MBeanServerConnection mbsc = cc.getMBeanServerConnection();

Я получаю коннектор JMX, затем подключаюсь к серверу MBean и вызываю метод - он работает. Я прохожу через аутентификатор, устанавливаю Spring Context и получаю его в Mbean.

Но когда я подключаюсь, например, с помощью Jconsole, я не получаю Spring Context в Mbean.

Я использую стратегию Inheritable Thread.

  1. Есть ли способ получить контекст также в MBean при подключении с использованием JConsole и других соединителей?
  2. Если я реализую JMX с помощью Spring, поможет ли это мне решить проблему?
  3. Является ли мой основной поток надежным (есть ли шанс, что я не получу контекст в MBean)? Я спрашиваю это, так как этот поток критичен для меня, чтобы быть надежным.

Большое спасибо!


person Northern Pole    schedule 31.01.2013    source источник


Ответы (1)


Я отвечу на свой вопрос, так как увидел интерес к нему и хотел поделиться своими выводами (не связанными с приведенными выше цифрами):

  1. Похоже, что локальное соединение с JConsole (или JVisualVM) (т. е. с локальным хостом) подключается напрямую к потоку, минуя аутентификатор JMX. Единственный обходной путь, который я нашел, — это подключение с полным URL-адресом (например, service:jmx:rmi:///jndi/rmi://10.45.32.112:3251/jmxrmi).

  2. Один механизм, который работает всегда, — это контекст безопасности Java; когда JMXAuthenticator возвращает Subject, вы можете назначить ему контекст безопасности Spring и, таким образом, наверняка получить его при вызове метода (например, в Advice, запущенном до вызова). Посмотрите этот ответ, который я получил: http://forum.springsource.org/showthread.php?134327-JMX-Authentication-with-Spring-Security-%283-1-x%29

  3. Я не могу точно сказать, является ли поток, упомянутый в вопросе, надежным. Но похоже, что это так, исходя из этого предположения: если вы создаете новое соединение для каждого вызова JMX и используете его только для одного вызова, вы получите правильное распространение контекста безопасности Spring.

Надеюсь, это помогло вам, люди :-)

person Northern Pole    schedule 11.03.2013