Java 从MDB调用时,如何调用具有特定角色的会话bean方法?

Java 从MDB调用时,如何调用具有特定角色的会话bean方法?,java,jakarta-ee,ejb,java-ee-6,jaas,Java,Jakarta Ee,Ejb,Java Ee 6,Jaas,我的会话bean定义了几个方法。 有些只能通过管理员角色访问,其他也可以通过用户角色访问 @Stateless @DenyAll public class MyBean { ... @RolesAllowed({"ADMIN"}) public void foo() { ... } @RolesAllowed({"ADMIN", "USER"}) public void bar() { ... } } 此会话bean由消息驱动bean调用 @MessageDriven(.

我的会话bean定义了几个方法。 有些只能通过管理员角色访问,其他也可以通过用户角色访问

@Stateless
@DenyAll
public class MyBean {
  ...
  @RolesAllowed({"ADMIN"})
  public void foo() { ... }

  @RolesAllowed({"ADMIN", "USER"})
  public void bar() { ... }
}
此会话bean由消息驱动bean调用

@MessageDriven(...)
public class MyListener implements MessageListener {
    public onMessage(Message message) {
        MapMessage msg = (MapMessage) message;
        String role = msg.getString("role");
        String action = msg.getString("action");

        if ("ADMIN".equals(role)) {
            if ("foo".equals(action)) {
                // TODO: call as ADMIN role!
                myBean.foo();
            }
            else if ("bar".equals(action)) {
                // TODO: call as ADMIN!
                myBean.bar();
            }
        }
        else if (role.equals("USER")) {
            if ("foo".equals(action)) {
                // TODO: call as USER role!
                myBean.foo();
            }
            else if ("bar".equals(action)) {
                // TODO: call as USER!
                myBean.bar();
            }                
        }
    }

    @EJB
    MyBean myBean;
}

由于MDB没有与其关联的凭据,因此我无法将安全性传播到会话bean。现在,我正在传递用户角色作为消息的一部分。但是我如何作为指定的角色执行呢?

您可以通过在MDB上声明
@RunAs
注释来传播安全上下文。不幸的是,一旦声明了
@RunAs
角色,就无法通过编程方式对其进行更改。以下是一个例子:

@MessageDriven(...)
@DeclareRoles("ADMIN")
@RunAs("ADMIN")
public class MyListener implements MessageListener {
}
从MDB调用会话bean的用户必须映射到预期角色:

    <security-role-mapping>
        <role-name>ADMIN</role-name>
        <principal-name>userCallingFromMDB</principal-name>
    </security-role-mapping>

管理
用户从MDB调用
如果您确实需要传递具有多个角色的用户,您可以尝试使用这些用户创建一个组,并使用
@RunAs(“组”)
(我没有尝试过,但从文档中可以看出。)

另请参见以下两个链接: