2015-05-14 40 views
5

我开始使用调用JBoss Wildfly(RestEasy)上的EJB层的REST api的应用程序。将用户主体从REST传播到EJB层

REST服务在战争中,然后调用ejb图层。 我知道如何实现对REST authenthication与RestEasy的拦截,检查等头基本上 喜欢这里描述的BASIC或任何自定义表单:http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/

现在的问题是 - 这只是对REST门面进行检查。在EJB层内,我不知道针对REST服务进行身份验证的用户。

要清除此 - 使用RMI和身份验证的远程EJB调用时,用户名存储在会话背景:

@Stateless 
public class LoginService { 
@Resource 
private SessionContext sessionContext; 

    public String getCurrentUser() { 
    Principal principal = sessionContext.getCallerPrincipal(); 
    return principal.getName(); //I need this to be the username from REST auth 
    //Currently it's anonymous 
    } 
} 

有没有办法传播在一些标准方式的用户名?例如。将自定义主体放到SessionContext中?

回答

1

您可以使用主题的doAs方法。 See the JavaDocs here

当战争中的资源调用到EJB时,使用经过身份验证的主题的doAs方法进行调用。这样主题就会传播到ejb的上下文中。 (例如@RolesAllowed将正常工作) 如果需要,您可以像往常一样在web.xml中配置身份验证。

要获得战争的主题,试试这个Subject userSubject=(Subject)PolicyContext.getContext("javax.security.auth.Subject.container");

+0

这不是工作在Wildlfly 9.0.2。试过“无状态休息”调用“无状态会话Bean”。试过“Pojo Rest”调用“无状态会话Bean”。没有用户主体传播。 W/@SecurityContext设置,带Resteasy特定安全配置(resteasy.role.based.security)。 –

相关问题