【问题标题】:@Produces for the current user object in JSF2 and JAX-RS?@Produces 用于 JSF2 和 JAX-RS 中的当前用户对象?
【发布时间】:2013-10-22 23:10:41
【问题描述】:

我有一个简单的@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 服务进行身份验证,我可以(需要?)在由 JAX-RS 控制的 bean 中从 SecurityContext 获取用户主体(在我的情况下是 resteasy):

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

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

【问题讨论】:

    标签: jsf-2 jax-rs cdi resteasy


    【解决方案1】:

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

    @Inject Principal userPrincipal;

    那会有用户名。

    【讨论】:

    • 如果他们通过 REST 进行身份验证,那就可以了。如果他们使用 JSF,我不会惊讶它会爆炸。我实际上不确定这里的最佳行动方案。
    • 什么意思?如果您通过 JSF 进行身份验证,我假设您正在调用 request.login(username,password) 来填充 Principal
    • OP 统计“同一用户也可以通过 Web 服务进行身份验证,我可以(需要?)在 JAX-RS 控制的 bean 中从 SecurityContext 获取用户主体”。他们正在寻找一种方法来处理这两种情况。
    • 我已经验证了生产者方法在与 JSF 一起使用时注入了正确的Principal。非常酷的技巧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多