我有一个简单的@Stateless
EJB,看起来像这样(剥离了所有日志记录和错误处理):
@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();
}
}
当用户使用JSF登录时工作正常。但是同一个用户也可以通过webservice进行身份验证,我可以(需要?)从JAX-RS控制的bean中获取SecurityContext
的用户主体(在我的情况下是resteasy):
public User doAuth(@Context SecurityContext ctx) {
return em.createNamedQuery("findByLogin", User.class)
.setParameter("login", ctx.getUserPrincial().getName())
.getSingleResult();
}
如何统一这些方法,以便当前用户对象的生成只由一个类负责?
答案 0 :(得分:3)
CDI允许您直接注入Principal
。就这样做:
@Inject Principal userPrincipal;
这将有用户名。