@Produces用于JSF2和JAX-RS中的当前用户对象?

时间:2013-10-15 08:15:46

标签: jsf-2 jax-rs cdi resteasy

我有一个简单的@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();
}

如何统一这些方法,以便当前用户对象的生成只由一个类负责?

1 个答案:

答案 0 :(得分:3)

CDI允许您直接注入Principal。就这样做:

@Inject Principal userPrincipal;

这将有用户名。