3

我有一个@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 登录时工作正常。但是同一个用户也可以通过 web 服务进行身份验证,我可以(需要?)从SecurityContext由 JAX-RS 控制的 bean 中获取用户主体(在我的情况下是 resteasy):

public User doAuth(@Context SecurityContext ctx) {
    return em.createNamedQuery("findByLogin", User.class)
         .setParameter("login", ctx.getUserPrincial().getName())
         .getSingleResult();
}

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

4

1 回答 1

3

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

@Inject Principal userPrincipal;

这将有用户名。

于 2013-10-15T11:15:13.403 回答