2013-10-28 43 views
0

我試圖在我的seam應用程序中更改身份驗證方法。我目前使用登錄表單進行身份驗證。將來,我想將身份驗證委託給另一個層,該層將使用包含經過身份驗證的用戶的用戶名的特定HTTP頭重寫每個請求。找不到使用接縫管理持久性上下文的實體

我正面臨一個奇怪的問題:當使用登錄頁進行身份驗證時,我能夠通過entityManager提取用戶。但是當我使用關於標題的信息查詢entityManager時,我無法找到用戶。 entityManager的行爲就像用戶不存在一樣。

我已經嘗試過兩種方法:

  • 創建觸發認證過程
  • 創建一個servlet它得到的請求,並開始 認證過程

兩次都是假的登錄頁面,entityManager無法返回任何用戶。

我讀了很多關於seam如何管理持久化上下文的知識,但是我沒有找到解決這個問題的唯一解釋。你有什麼想法?建議?甚至猜測?

其使用的EntityManager的代碼如下:

@Name("userService") 
@AutoCreate 
public class UserService { 
    @Logger 
    private Log logger; 

    @In 
    private EntityManager entityManager; 

    public User getUser(String email) { 
      try { 
       return entityManager 
         .createQuery("SELECT u FROM User u where u.email=:email", 
           User.class).setParameter("email", email.trim()) 
         .getSingleResult(); 
      } catch (NoResultException e) { 
       return null; 
      } 
    } 
} 

用於持久性上下文的配置是:

<persistence:managed-persistence-context startup="false" scope="stateless" 
     auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" /> 

我創建一個空的假登錄頁面,其執行頁面動作(認證)其中我得到請求用戶標頭,如下所示:

@Name("applicationAuthenticator") 
public class ApplicationAuthenticator { 
    @Logger 
    private Log log; 

    @In 
    private Identity identity; 
    @In 
    private Credentials credentials; 
    @In(required=true) 
    private UserService userService; 

@Begin 
    public void login() throws LoginException { 
     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     String userName=request.getHeader("user"); 
     identity.unAuthenticate(); 
     credentials.setUsername(userName); 
     credentials.setPassword("fake"); 
     identity.acceptExternallyAuthenticatedPrincipal(new SimplePrincipal(credentials.getUsername())); 
     User user=userService.getUserByEmail(credentials.getUsername()); 
     identity.authenticate(); 
     identity.quietLogin(); 
    } 
} 

THX提前:-)

+0

你能發表一些代碼嗎?特別是使用實體管理器的位 – DaveB

+0

看來,一個seam攔截器(hibernate安全攔截器,我猜)是禁止通過entityManager.do訪問數據源你有任何想法如何禁用或繞過只是休眠安全攔截器? –

+0

您是否檢查過字符串實際上是從頭中取出的?如果是這樣的查詢實際執行?也可能是顯而易見的,但是你的UserService類是受限制的嗎? – DaveB

回答

0

THX @DaveB您的回覆,它使用的EntityManager的代碼如下:

public User getUser(String email) { 
     try { 
      return entityManager 
        .createQuery("SELECT u FROM User u where u.email=:email", 
          User.class).setParameter("email", email.trim()) 
        .getSingleResult(); 
     } catch (NoResultException e) { 
      return null; 
     } 
    } 

的持久化上下文的配置是:

<persistence:managed-persistence-context startup="false" scope="stateless" 
     auto-create="true" name="entityManager" persistence-unit-jndi-name="java:/EntityManagerFactory" /> 

我創建一個空的虛假登錄頁面,執行一個頁面動作(身份驗證),其中我得到請求用戶標題如下:

HttpServletRequest request = (HttpServletRequest) FacesContext 
       .getCurrentInstance().getExternalContext().getRequest(); 
     String userName = request.getHeader("user"); 
+0

所以你所說的是,上面的查詢在被作爲頁面動作調用時不會給出任何結果,但是當它從標準登錄表單被調用時,它確實能夠工作......?你可以發佈整個支持bean /類,特別是如何獲取您的entityManager實例。 – DaveB

+0

btw。你應該添加這個額外的細節問題不作爲答案 – DaveB

+0

Thx DaveB爲您的快速回復:),我更新了更多的代碼細節問題。我說的是,查詢確實工作使用登錄表單(提交按鈕的形式執行頁面動作),但是當我發送一個HTTP GET請求(與用戶頭)到一個頁面動作(applicationAuthenticator.login)查詢不起作用(userService.getUser返回空)。 –

相關問題