Java 从MDB调用时,如何调用具有特定角色的会话bean方法?
我的会话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(.
@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(“组”)
(我没有尝试过,但从文档中可以看出。)
另请参见以下两个链接: