Authentication 在servlet和EJB之间使用@RunAs

Authentication 在servlet和EJB之间使用@RunAs,authentication,jakarta-ee,servlets,ejb,Authentication,Jakarta Ee,Servlets,Ejb,我有以下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 Servlet

我有以下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>

问题:当我使用只映射到
guest
角色的用户调用
GuestServlet
时,EJB抛出一个
javax.EJB.EJBAccessException
,尽管servlet上存在
@RunAs
注释。我是否也应该将用户映射到
远程来宾
角色?如果用户必须同时映射到
guest
remoteguest
,那么
@RunAs
的真正目的是什么?

是的,用户需要映射到角色。尽管它可能与具有“来宾”角色的用户不同。如EJB 3.1规范17.3.4.1所述:

因为Bean提供程序和应用程序汇编程序没有,在 一般,了解操作系统的安全环境 环境中,运行方式标识由逻辑角色名称指定, 它对应于Bean定义的一个安全角色 元数据注释中的提供程序或应用程序汇编程序或 部署描述符

部署人员然后分配在中定义的安全主体 要用作运行方式主体的操作环境 身份。部署人员分配的安全主体应该是 已分配给由指定的安全角色的主体 运行方式注释或运行方式部署的role name元素 描述符元素

和oracle jee6教程:

@RunAs的作用是允许具有不同角色和用户集的两个容器之间进行通信(如上面的链接所示),或者为没有安全上下文的组件提供安全标识:例如,消息驱动Bean需要调用另一个Bean,该Bean要求调用方具有某些角色

@Stateless
@DeclareRoles("remote-guest")
public class TestBean implements Test {

    @RolesAllowed("remote-guest")
    public void guest() {
        System.out.println("TestBean.guest()");
    }

}