2013-10-15 39 views
3

我有一個簡單的@Stateless EJB,看起來像這樣(剝奪了所有的日誌和錯誤處理):@ JSF2和JAX-RS中的當前用戶對象的生產?

@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(在我的情況RestEasy的)控制的一個bean(需要):

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

我如何能夠統一這些方法使得當前用戶對象的生產僅由一個類來負責?

回答

3

CDI允許您直接注入Principal。只是這樣做:

@Inject Principal userPrincipal;

這將使得用戶名。

+0

如果他們通過REST進行身份驗證,則可以使用。如果他們使用JSF,它不會讓我感到驚訝,它會炸燬。實際上我不確定這裏的最佳行動方案。 – LightGuard

+0

你是什麼意思?如果你通過JSF進行身份驗證,我假設你調用'request.login(username,password)'來填充'Principal'。 –

+0

OP統計「同一用戶也可以通過web服務進行身份驗證,我可以(需要?)從SecurityContext中的用戶主體獲取由JAX-RS控制的bean」。他們正在尋找一種處理兩者的方法。 – LightGuard