2

我的 Session bean 定义了几个方法。有些只能由 ADMIN 角色访问,有些也可以由 USER 角色访问。

@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。现在我将用户的角色作为消息的一部分传递。但是我如何执行我指定的角色呢?

4

1 回答 1

1

您可以通过在 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>

如果您绝对需要传递具有多个角色的用户,您可以尝试使用这些用户创建一个组并使用@RunAs("GROUP")(我没有尝试过,但从文档中似乎可以。)

另请参阅这两个链接:

于 2013-04-17T05:54:11.447 回答