JMX客户端会话

时间:2011-01-24 17:28:04

标签: java jmx mbeans shiro

我已经研究过JMX一段时间了,但是我被卡住了。

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

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

如何将客户端与线程相关联,或者是否有办法在交互的MBean中检索客户端数据?

1 个答案:

答案 0 :(得分:0)

经过研究和尝试不同的技术;有两个赢家:

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

2-根据AccessControlContext附加Shiro:这是我选择的解决方案,Shiro的默认主题检索机制不考虑Java的访问控制上下文。我很久以前就进行了测试以测试这个测试,但它没有用。现在我知道了原因:默认情况下,SecurityUtils.getSubject()调用将检索到的Subject附加到当前调用的线程,但这种方法没用,因为线程可以在客户端之间共享。但AccessControlContext功能更强大,看起来JMX可以很好地使用它;您的访问控制上下文(在JMXAuthenticator登录期间进行身份验证)可以从MBeanServerForwarder访问,甚至可以在您的MBean中访问。我通过检索其主体的多个客户端对此进行了测试,它只是起作用。

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

1-使用构建器类Subject.Builder创建一个未连接的Shiro主题。

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

3-使用包含Shiro主题的单例集创建一个可变JAAS主题作为私人凭据。

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

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