我已经实现了 JMXAuthenticator
通过 RMI 进行 JMX 身份验证,但是我不确定如何创建角色以允许只读/读写访问级别。例如,在 JMXAuthenticator.authenticate
中,我有自定义身份验证逻辑,并希望它确定访问角色。我尝试了以下方法,但在 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=jmx.management.properties 的路径
。
但是,当我通过 JConsole 连接并以基本用户身份进行身份验证(只读访问权限)时,我可以访问 bean 上的 setter。我通过完整的 service:jmx:rmi:...
url 进行连接。
所以我的问题是
- 我是否需要对 bean 中的 setter 进行注释/执行任何操作,以将它们指定为仅对管理员用户可见?
- 我是否没有正确构建
JMXAuthenticator
返回的Subject
对象? - 还缺少任何其他配置/设置吗?
谢谢
编辑我的 MBean 只是一个基本的 POJO,其私有(private)字段具有公共(public) getter 和 setter 以及其他公共(public)方法。
最佳答案
找到答案:需要通过InvocalHandler
接口(interface)实现自定义调用处理程序。这会在服务器调用到达 Bean 之前拦截它们。在身份验证方法中,您需要检查主体
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(每个访问级别一个扩展)并将其分配给上面身份 validator 中的主体,然后在 IH 中检索主体后,我可以通过 instanceof
检查类型,并且允许继续或抛出 SecurityException
的操作。
关于java - JMX 身份验证 - 基于角色的 MBean 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192456/