Jsf 2 @为JSF2和JAX-RS中的当前用户对象生成?
我有一个简单的Jsf 2 @为JSF2和JAX-RS中的当前用户对象生成?,jsf-2,jax-rs,cdi,resteasy,Jsf 2,Jax Rs,Cdi,Resteasy,我有一个简单的@无状态EJB,看起来像这样(去掉了所有日志记录和错误处理): 当用户使用JSF登录时工作正常。但是同一个用户也可以通过webservice进行身份验证,我可以(需要?)在JAX-RS控制的bean中从SecurityContext获取用户主体(在我的例子中是resteasy): 如何统一这些方法,使当前用户对象的生成只由一个类负责?CDI允许您直接注入主体。只要这样做: @injectprincipal-userPrincipal 这将有用户名。如果他们通过REST进行身份验证,
@无状态
EJB,看起来像这样(去掉了所有日志记录和错误处理):
当用户使用JSF登录时工作正常。但是同一个用户也可以通过webservice进行身份验证,我可以(需要?)在JAX-RS控制的bean中从SecurityContext
获取用户主体(在我的例子中是resteasy):
如何统一这些方法,使当前用户对象的生成只由一个类负责?CDI允许您直接注入
主体。只要这样做:
@injectprincipal-userPrincipal代码>
这将有用户名。如果他们通过REST进行身份验证,那么这就行了。如果他们正在使用JSF,它会爆炸也就不足为奇了。我真的不知道最好的做法是什么,你是什么意思?如果您通过JSF进行身份验证,我假设您正在调用request.login(用户名、密码)
来填充Principal
。OP统计数据表明“同一用户也可以通过webservice进行身份验证,我可以(需要?)从JAX-RS控制的bean中的SecurityContext获取用户主体”。他们正在寻找一种处理这两者的方法。我已经验证了producer方法在与JSF一起使用时有一个适当的主体。很酷的把戏。
@Stateless
public class CurrentUserBean {
@PersistenceContext
private EntityManager em;
@Produces @Named @LoggedIn
@SessionScoped
public User produceCurrentUser() {
Principal principal = Faces.getExternalContext().getUserPrincipal();
String username = (principal == null ? null : principal.getName());
return em.createNamedQuery("findByLogin", User.class)
.setParameter("login", username)
.getSingleResult();
}
}
public User doAuth(@Context SecurityContext ctx) {
return em.createNamedQuery("findByLogin", User.class)
.setParameter("login", ctx.getUserPrincial().getName())
.getSingleResult();
}