我正在启动一个使用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?
答案 0 :(得分:1)
您可以使用主题的doAs
方法。
See the JavaDocs here
当战争从战争到EJB调用时,使用经过身份验证的主题的doAs方法。这样,主题被传播到ejb的上下文。 (例如@RolesAllowed会正常工作) 如果需要,您可以照常在web.xml中配置身份验证。
要让战争中的主题受理,请尝试Subject userSubject=(Subject)PolicyContext.getContext("javax.security.auth.Subject.container");