JMX身份validation – 基于角色的MBean操作
我已经通过RMI实现了JMXAuthenticator
for JMX身份validation,但是我不确定如何创建角色以允许readonly / readwrite访问级别。 例如,在JMXAuthenticator.authenticate
我有自定义身份validation逻辑,并希望这可以确定访问角色。 我尝试了以下但在JConsole中执行操作时没有任何区别:
@Override public Subject authenticate(Object credentials) { Subject subject = new Subject(); JMXPrincipal p; //...my logic String accessLevel = myCustomLogic(); if (accessLevel.equals("admin")) { p = new JMXPrincipal("adminrole"); } else { p = new JMXPrincipal("basicrole"); } subject.getPrincipals().add(p); return subject; }
然后我创建了一个包含的访问文件jmxaccess.properties
adminuser readwrite basicuser readonly
和jmx.management.properties
,其中包含com.sun.management.jmxremote.access.file=PATH TO ACCESS FILE
,我使用-Dcom.sun.management.config.file=PATH TO jmx.management.properties
运行应用程序-Dcom.sun.management.config.file=PATH TO jmx.management.properties
。
但是,当我通过JConsole连接并作为基本用户进行身份validation(只读访问)时,我可以访问bean上的setter。 我通过全service:jmx:rmi:...
连接service:jmx:rmi:...
url。
所以我的问题是
- 我是否需要对我的bean中的setter进行注释/执行任何操作,以将它们指定为仅对管理员用户可见?
- 我没有正确构建
JMXAuthenticator
返回的Subject
对象吗? - 缺少任何其他配置/设置?
谢谢
编辑我的MBean只是一个基本的POJO,私有字段包含公共getter和setter以及另一个公共方法。
找到答案:需要通过InvocationHandler
接口实现自定义调用处理程序。 这会在服务器调用到达bean之前拦截它们。 在authenticate方法中,您需要检查主体
AccessControlContext acc = AccessController.getContext(); Subject subject = Subject.getSubject(acc); Set principals = subject.getPrincipals(JMXPrincipal.class); if(principals != null && !principals.isEmpty()) { Principal principal = (Principal)principals.iterator().next(); //your checks }
我扩展了JMXPrincipal(每个访问级别一个扩展)并将其分配给上面的Authenticator中的Subject,然后在IH中检索主体后,我可以通过instanceof
检查类型,并允许操作继续或抛出SecurityException
。