2012-08-10 40 views
3

我有一個JSF Web應用程序,它使用Cookie進行自動身份驗證,但不提示輸入用戶名&的密碼。它使用帶有用戶名和隨機UUID的cookie,並使用WebFilter進行重定向。使用HttpServletRequest和LDAP自動登錄

當客戶端沒有cookie時,認證通過HttpServletRequest #login(String username, String password)完成。在幕後,這種方法使用JAAS認證,並使用後面的LDAP服務器。

當我的應用程序通過持有userid和UUID的cookie識別用戶時,我的問題就出現了。在這種情況下,

  1. 應用程序不知道密碼,所以方法HttpServletRequest #login(String username, String password)不能使用。
  2. 我應該通過JNDI向LDAP服務器詢問密碼嗎?這似乎不可能乍一看
  3. 或者,我可以將密碼存儲在我的分貝。但是這意味着信息的重複,我不喜歡它。
  4. 我見過around人只是簡單地爲會話設置屬性「角色」,但這似乎並不等同於JAAS登錄。與「等效」我的意思是能夠使用isUserInRole()getUserPrincipal()方法。

所以,問題是:在這種情況下,我該如何登錄用戶?我希望現在這個問題更清楚。

編輯

爲了讓代碼說話,我添加了Managed Bean的一個簡化版本:

@ManagedBean 
@SessionScoped 
public class loginBean() { 
    private String username = null; 
    private String password = null; 
    private UUID uuid = null; 
    private boolean rememberMe = false; 

    public void doLogin() { 
     checkCookies(); // this method sets the property values after checking if 
          // username & uuid match the ones saved previously 
     if (username != null && uuid != null && rememberMe) { 
      // authenticate automatically. Here I don't know how to proceed, because 
      // I don't have the password, unless I have saved it in the application's db, 
      // duplicating it because it's already in LDAP server. 
     } else { 
      httpServletRequest.login(username, password); // this uses LDAP behind JAAS 
      createCookies(); // this method also saves username & uuid in the app's db 
     } 
    } 
+0

如果設置正確,則無法從LDAP獲取密碼。你爲什麼認爲你需要它?你沒有。 – EJP 2012-08-11 12:48:36

+0

哇!事實上,我一直無法獲得密碼。我認爲這是一個許可問題。爲什麼我不需要密碼? – perissf 2012-08-11 20:21:20

+0

密碼用於驗證。 LDAP已完成身份驗證。你不需要它。你爲什麼這麼想? – EJP 2012-08-12 00:22:04

回答

3

要(通過cookie並UUID代替密碼,你的情況)做一個自定義的方式實際容器登錄,您需要創建自己的登錄模塊。

Java EE中專用的API是JASPI/JASPIC(人們永遠無法完全同意這個名稱,例如谷歌查詢變得複雜)。

登錄模塊處於完全控制狀態,無需使用ldap服務器進行身份驗證(如果您的應用程序可以100%確定地驗證該cookie有效)。您可能必須授權用戶(向ldap服務器詢問用戶擁有的角色/組)。

作爲JASPI/JASPIC的替代方案,您還可以查看服務器正在使用的專有登錄模塊機制。

1

使用此情況下,LDAP條目相當於請求目錄服務器使用應用程序提供的信息驗證連接。在LDAP方面,身份驗證意味着現有的LDAP 會話(即到目錄服務器的連接)的認證狀態已由成功的BIND請求更改。

Web應用程序應該向用戶請求認證的適當信息,並將這些信息作爲BIND請求呈現給目錄服務器。所需信息根據Web應用程序(LDAP客戶端)使用的身份驗證方法而有所不同:

  • 一個簡單的BIND請求需要一個專有名稱和一個密碼。這個可分辨的名稱和密碼應通過安全連接作爲簡單的BIND請求傳輸到目錄服務器。
  • SASL BIND請求使用預定義的SASL機制。每個服務器的機制都不相同,範圍也從GSSAPI到PLAIN。

在收到BIND請求,目錄服務器將立即更改連接的認證狀態匿名和處理BIND請求。如果請求可以被成功處理,則目錄服務器使用包括零(0)的整數結果代碼的BIND響應來響應LDAP。這表明專有名稱或用戶名能夠成功認證。

Web應用程序應使用某種機制來維護身份驗證狀態,並在身份驗證狀態更改時向目錄服務器發出BIND請求。這可能是會話超時或其他一些機制。被選擇的方法不應該被用戶改變。

總之,使用目錄服務器來檢查身份驗證憑證並使用會話框架來管理身份驗證狀態。

編輯:

似乎這是一個有爭議的答案。

  • 使用cookie不會處理瀏覽器禁用cookie的情況,並且cookie在使用會話時不需要維護身份驗證狀態。
  • 會話不需要密碼,也不應該在內存或會話中存儲任何密碼等敏感信息。當身份驗證狀態到期(如果曾經)或會話過期(如果曾經),應用程序應該請求密碼。
+1

聽起來好像你正在告訴提問者去做一些他或她要怎麼做的事情。指導他們的圈子。 -1如果你問我。 – BillR 2012-08-12 18:36:09

+0

@BillR用戶實際上在這裏要求什麼,以至於你無法得到一個正確而完整的答案並不是那麼令人吃驚。 – EJP 2012-08-13 00:20:24

+0

感謝您的回答。我知道我需要通過將密碼保存在應用程序的數據庫中,或通過創建自定義SAM模塊來處理此邏輯。 – perissf 2012-08-13 06:28:50