У меня есть сервер 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.
- Есть ли способ получить контекст также в MBean при подключении с использованием JConsole и других соединителей?
- Если я реализую JMX с помощью Spring, поможет ли это мне решить проблему?
- Является ли мой основной поток надежным (есть ли шанс, что я не получу контекст в MBean)? Я спрашиваю это, так как этот поток критичен для меня, чтобы быть надежным.
Большое спасибо!