繁体   English   中英

在servlet和EJB之间使用@RunAs

[英]Using @RunAs between a servlet and an 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 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()");
    }

}

问题:当我使用仅映射到guest角色的用户调用GuestServlet时,尽管servlet上存在@RunAs注释,但EJB GuestServlet抛出javax.ejb.EJBAccessException 我是否还应该将用户映射到remote-guest角色? 如果用户必须同时映射到guestremote-guest ,那么@RunAs的真正目的是什么?

是的,用户需要映射到角色。 虽然它可能与具有“访客”角色的用户不同。 如EJB 3.1规范17.3.4.1中所述:

由于Bean Provider和Application Assembler通常不知道操作环境的安全环境,因此run-as身份由逻辑角色名称指定,该角色名称对应于Bean Provider定义的安全角色之一或应用程序汇编程序在元数据注释或部署描述符中。

然后,Deployer会分配在操作环境中定义的安全主体,以用作run-as身份的主体。 部署者分配的安全主体应该是已分配给RunAs注释指定的安全角色或运行方式部署描述符元素的role-name元素的主体。

和oracle jee6教程: http ://docs.oracle.com/cd/E19226-01/820-7627/bnbyr/index.html

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM