将用户主体从REST传播到EJB层

时间:2015-05-14 08:55:25

标签: java rest jboss ejb resteasy

我正在启动一个使用REST api的应用程序,该API在JBoss Wildfly(RestEasy)上调用EJB层。

REST服务在战争中,然后调用ejb层。 我知道如何在REST上使用RestEasy Interceptor实现BASIC或任何自定义形式的验证,它可以检查Headers等。 基本上如此处所述: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 个答案:

答案 0 :(得分:1)

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

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

要让战争中的主题受理,请尝试Subject userSubject=(Subject)PolicyContext.getContext("javax.security.auth.Subject.container");