我有一个没有配置 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。

我正在使用可继承线程策略。
  • 当使用 JConsole 和其他连接器进行连接时,有没有办法在 MBean 中获取上下文?
  • 如果我用Spring实现JMX,能帮我解决问题吗?
  • 是否是我的主要流程傻瓜证明(是否有可能我不会在 MBean 中获得上下文)?我在问这个,因为这个流程对我来说很重要,所以是万无一失的。

  • 非常感谢!

    最佳答案

    我会回答我自己的问题,因为我看到了它的兴趣并想分享我自己的结论(与上面的数字无关):

  • 看起来像在本地连接 JConsole(或 JVisualVM)(即到 localhost)直接连接到线程,而无需通过 JMX Authenticator。
    我发现的唯一解决方法是连接完整的 URL(例如 service:jmx:rmi:///jndi/rmi://10.45.32.112:3251/jmxrmi)。
  • 一种始终有效的机制是 Java 安全上下文;当 JMXAuthenticator 返回一个 Subject 时,您可以将 Spring Security Context 分配给它,从而在调用方法时肯定会得到它(例如,在调用之前运行的 Advice 中)。
    看到我得到的这个回复:
    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/

    10-13 02:31