java - JMX 身份验证 - 基于角色的 MBean 操作

标签 java authentication jmx mbeans

我已经实现了 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/

相关文章:

java - GWT 中的 Cookies.removeCookie ("cookieName"未删除 Cookie

python - Book : twisted network programming essentials, 示例 9-1 不起作用

variables - 如何在变量中获取 JMX Jmeter 文件名

activemq - 使用 Cisco VPN 连接时本地主机解决问题

返回 javax.ws.rs.core.Response 对象的 Java JMX 调用方法不起作用(获取 NotSerializedException)

java - 当有两个 JLabel 时,一个 JLabel 会消失

java - JSON 网络 token (JWT) : Authorization vs Authentication

java - 与 JUNG 库合作

python - Flask session 变量

android - 整洁架构和身份验证。正确的方法?