Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 @为JSF2和JAX-RS中的当前用户对象生成?_Jsf 2_Jax Rs_Cdi_Resteasy - Fatal编程技术网

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();
}