java - JMX 客户端 session

标签 java jmx mbeans shiro

我研究 JMX 一段时间了,但我陷入困境。

我有一个通过 JMX 向远程客户端公开某些功能的应用程序,尽管现有的安全功能可能足以满足大多数情况,我的应用程序使用 Apache Shiro 框架作为安全后端。

我的问题是我不知道如何在服务器端收集客户端数据。 Shiro 需要一种方法来识别客户端(主题),通常执行线程与主题相关联,但在线 JMX 文档没有提供有关远程 JMX 线程模型的太多线索。

我如何将客户端与线程关联起来,或者有没有办法在交互的 MBean 内检索客户端数据?

最佳答案

在研究并尝试不同的技术之后;有两名获奖者:

1- 名为 ClientContext 的新功能将成为 Java 7 的一部分:Java 7 尚未完成,ClientContext 将破坏向后兼容性。

2- 将 Shiro 主题附加到 AccessControlContext:这是我选择的解决方案,Shiro 的默认主题检索机制不考虑 Java 的访问控制上下文。我很久以前就进行了测试来测试这一点,但它不起作用。现在我知道为什么了:默认情况下,SecurityUtils.getSubject() 调用将检索到的主题附加到当前调用的线程,但这种方法是无用的,因为线程可以在客户端之间共享。但是 AccessControlContext 更强大,并且看起来 JMX 与它配合得很好;您的访问控制上下文(在 JMXAuthenticator 登录期间进行身份验证)可以从 MBeanServerForwarder 甚至您的 MBean 内部进行访问。我用多个客户端检索他们的本金对此进行了测试,它很有效。

编辑:我如何将 Shiro 主题附加到当前 AccessControlContext?

1- 使用构建器类Subject.Builder 创建一个独立的 Shiro 主题。

2-验证用户身份(使用Shiro主体的登录方法等)

3- 使用包含 Shiro 主题作为私有(private)凭据的单例集创建可变 JAAS 主题。

4- 向底层 Java 安全系统提供 JAAS 主题(例如,在 JMXAuthenticator 的身份验证方法中返回主题)

可以创建一个辅助类来简化这种方法。当您需要代表 Shiro 主题执行操作(用于授权等)时,请从 AccessControlContext 获取它并使用 Subject.execute... 方法之一。这可以在代理或转发器(如 MBeanServerForwarder)内执行。

关于java - JMX 客户端 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785020/

相关文章:

java - 如何防止 Netbeans 6.9 将小部件属性存储在属性文件中

java - 将标准 mbean 转换为动态 mbean/代码生成

jmx - 属性和项目的 Prometheus jmx 导出器模式匹配

java - 调用返回通用列表类类型对象的方法会抛出 java.lang.IllegalArgumentException

java - Lucene 自定义评分(Lucene 3.2)涉及遍历索引中的所有文档 - 最快的方法?

java - 为每个 Spark 执行器设置自定义 java.rmi.server.hostname

java - Spring Boot @ManagedResource 组件在 Docker 中启动时在 VisualVM 中不可见,但可以在本地运行

web-services - "facade webservice"的监控和记录策略?

java - MBeans操作错误Weblogic

java - fragment 内的自定义列表适配器实例化