4

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

我正在使用可继承线程策略。

  1. 当使用 JConsole 和其他连接器进行连接时,是否有办法在 MBean 中获取上下文?
  2. 如果我使用 Spring 实现 JMX,它会帮助我解决问题吗?
  3. 我的主要流程是万无一失的吗(有没有机会我不会在 MBean 中获得上下文)?我问这个,因为这个流程对我来说很重要,所以要做到万无一失。

非常感谢!

4

1 回答 1

1

我将回答我自己的问题,因为我对此感兴趣并想分享我自己的结论(与上面的数字无关):

  1. 它看起来像在本地(即本地主机)连接 JConsole(或 JVisualVM)直接连接到线程,而不通过 JMX Authenticator。我发现的唯一解决方法是连接完整的 URL(例如 service:jmx:rmi:///jndi/rmi://10.45.32.112:3251/jmxrmi)。

  2. 一种始终有效的机制是 Java 安全上下文。当 JMXAuthenticator 返回一个 Subject 时,您可以将 Spring Security Context 分配给它,因此在调用方法时肯定会得到它(例如,在调用之前运行的 Advice 中)。看到我得到的这个回复:http: //forum.springsource.org/showthread.php?134327-JMX-Authentication-with-Spring-Security-%283-1-x%29

  3. 我不能确定问题中提到的流程是否是万无一失的。但看起来确实如此,基于以下假设:如果您为每个 JMX 调用创建一个新连接并将其仅用于一次调用,您将获得 Spring Security Context 正确传播。

希望它对你们有帮助:-)

于 2013-03-11T07:57:47.977 回答