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