我有一个没有配置 Spring 的 JMX 服务器,我正在尝试为授权部分实现 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);
在 MBean 中,我尝试获取它并查看它是否已正确传递(将来我计划添加 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 进行连接时,我没有在 Mbean 中获得 Spring Context。
我正在使用可继承线程策略。
非常感谢!
最佳答案
我会回答我自己的问题,因为我看到了它的兴趣并想分享我自己的结论(与上面的数字无关):
我发现的唯一解决方法是连接完整的 URL(例如 service:jmx:rmi:///jndi/rmi://10.45.32.112:3251/jmxrmi)。
看到我得到的这个回复:
http://forum.springsource.org/showthread.php?134327-JMX-Authentication-with-Spring-Security-%283-1-x%29
但似乎是这样,基于这个假设:
如果您为每个 JMX 调用创建一个新连接并仅将其用于一次调用,您将获得 Spring Security Context 正确传播。
希望它对你们有所帮助:-)
关于authentication - spring 安全 jmx 身份验证器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14621971/