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

Java 将用户主体从REST传播到EJB层,java,rest,jboss,ejb,resteasy,Java,Rest,Jboss,Ejb,Resteasy,我正在启动一个应用程序,它使用RESTAPI调用JBoss Wildfly(RestEasy)上的EJB层 REST服务位于war中,war随后调用ejb层。 我知道如何使用RestEasy拦截器在REST上实现基本或任何自定义形式的身份验证,该拦截器检查头文件等。 基本上就像这里描述的: 现在的问题是——这只是对REST外观的检查。在EJB层中,我不知道对REST服务进行身份验证的用户 要清除此问题-使用RMI和远程EJB调用进行身份验证时,用户名存储在会话上下文中: @Stateless p

我正在启动一个应用程序,它使用RESTAPI调用JBoss Wildfly(RestEasy)上的EJB层

REST服务位于war中,war随后调用ejb层。 我知道如何使用RestEasy拦截器在REST上实现基本或任何自定义形式的身份验证,该拦截器检查头文件等。 基本上就像这里描述的:

现在的问题是——这只是对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?

您可以使用主题的
doAs
方法。

当从war调用EJB时,使用经过身份验证的主体的doAs方法进行调用。通过这种方式,主题被传播到ejb的上下文中。(例如@RolesAllowed将很好地工作) 如果需要,可以像往常一样在web.xml中配置身份验证


要在war中获取主题,请尝试以下操作
subject-userSubject=(subject)PolicyContext.getContext(“javax.security.auth.subject.container”)

这在Wildlfly 9.0.2上不起作用。尝试了调用“无状态会话Bean”的“无状态Rest”。尝试了调用“无状态会话Bean”的“pojorest”。没有用户主体传播。W/@SecurityContext设置,W/Resteasy特定安全配置(Resteasy.role.based.security)。