我有以下servlet。
@DeclareRoles("remote-guest")
@RunAs("remote-guest")
public class GuestServlet extends HttpServlet {
@EJB
private Test test;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
test.guest();
}
}
映射servlet,以便只有角色为guest
的用户才能调用它。
<servlet>
<servlet-name>guest-servlet</servlet-name>
<servlet-class>test.web.GuestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>guest-servlet</servlet-name>
<url-pattern>/guest</url-pattern>
</servlet-mapping>
<security-role>
<role-name>guest</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>guest-resources</web-resource-name>
<url-pattern>/guest</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>guest</role-name>
</auth-constraint>
</security-constraint>
Test
EJB由以下TestBean
类实现。
@Stateless
@DeclareRoles("remote-guest")
public class TestBean implements Test {
@RolesAllowed("remote-guest")
public void guest() {
System.out.println("TestBean.guest()");
}
}
问题:当我使用仅映射到GuestServlet
角色的用户调用guest
时,尽管存在,但EJB仍会抛出javax.ejb.EJBAccessException
servlet上的@RunAs
注释。我还应该将用户映射到remote-guest
角色吗?如果用户必须同时映射到guest
和remote-guest
,那么@RunAs
的真正目的是什么?
答案 0 :(得分:6)
是的,用户需要映射到该角色。虽然它可能与具有“访客”角色的用户不同。如EJB 3.1规范17.3.4.1中所述:
因为Bean Provider和Application Assembler没有,所以 一般来说,了解运营的安全环境 在环境中,run-as标识由逻辑角色名称指定, 它对应于Bean定义的一个安全角色 提供者或应用程序汇编程序在元数据注释或 部署描述符。
然后,部署者分配一个安全主体 作为run-as的主体的操作环境 身份。部署者分配的安全主体应为a 已分配给指定的安全角色的主体 RunAs注释或run-as部署的role-name元素 描述符元素。
和oracle jee6教程: http://docs.oracle.com/cd/E19226-01/820-7627/bnbyr/index.html
@RunAs的作用是允许具有不同角色和用户集的2个容器之间的通信(如上面的链接所示),或者为没有安全上下文的组件提供安全标识:例如,消息驱动Bean需要调用另一个需要调用者具有某些角色的bean。