2012-06-25 40 views
10

使用Java Servlets進行表單身份驗證的標準方式是什麼?標準表單身份驗證Java servlets

既然現在我已經實現了我自己用一個簡單的POST HTML表單:

  1. 檢查對數據庫
  2. 如果存在發送的參數,省去了用戶對象到HttpSession中
  3. 檢查每小服務程序是否該對象是本
  4. 如果不是:重定向到登錄頁面顯示錯誤消息

但是現在我偶然發現了How to Configure Security with Embedded Jetty,現在我正在考慮重新使用已經實現的解決方案來解決這個問題,但是這裏採用了什麼樣的標準方法呢?我自己使用Jetty,但Tomcat或其他Web服務器呢?

我也讀過約j_security_check,那是什麼?這是一種傳統的方法嗎?

回答

14

您應該使用由Tomcat,Websphere,Glassfish等Servlet容器提供的JAAS安全性。

默認情況下,這些容器支持這些身份驗證類型:

  • BASIC
  • DIGEST
  • FORM
  • CLIENT-CERT

HTTP基本驗證

指定HTTP基本身份驗證要求服務器從Web客戶端請求用戶名和密碼,並通過將其與指定或默認領域中授權用戶的數據庫進行比較來驗證用戶名和密碼是否有效。

當您不指定身份驗證機制時,基本身份驗證是默認設置。

當使用基本身份驗證,發生下列操作:

  1. 客戶端請求訪問受保護的資源。
  2. Web服務器返回一個請求用戶名和密碼的對話框。
  3. 客戶端提交用戶名和密碼到服務器。 4. \服務器在指定領域中對用戶進行身份驗證,如果成功,則返回請求的資源。

下圖顯示了指定HTTP基本認證時會發生的情況。 enter image description here

HTTP基本認證的客戶端和服務器之間的HTTP基本認證四個步驟圖

基於表單的認證

基於表單的認證允許開發者控制的外觀和感覺通過自定義HTTP瀏覽器呈現給最終用戶的登錄屏幕和錯誤頁面來登錄認證屏幕。當聲明基於表單的身份驗證時,會發生以下操作。

  1. 客戶端請求訪問受保護的資源。
  2. 如果客戶端未經身份驗證,服務器會將客戶端重定向到登錄頁面。
  3. 客戶端提交登錄表單到服務器。
  4. 服務器嘗試驗證用戶。
  5. 如果身份驗證成功,則會檢查經過身份驗證的用戶主體,以確保其身份處於有權訪問資源的角色中。如果用戶被授權,則服務器通過使用存儲的URL路徑將客戶端重定向到資源。
  6. 如果認證失敗,客戶端將被轉發或重定向到錯誤頁面。

下圖顯示了指定基於表單的身份驗證時發生的情況。

enter image description here

當你創建一個基於表單的登錄,一定要保持使用cookie或SSL會話信息會話。

要使認證正常進行,登錄表單的動作必須始終爲j_security_check。此限制是爲了使登錄表單可以工作,而不管它是用於哪種資源,並避免要求服務器指定出站表單的操作字段。下面的代碼片段顯示形式應如何編碼到HTML頁面:

<form method="POST" action="j_security_check"> 
    <input type="text" name="j_username"> 
    <input type="password" name="j_password"> 
</form> 

摘要式身份驗證

像基本身份驗證,摘要式身份驗證驗證基於用戶名和密碼的用戶。但是,與基本身份驗證不同,摘要身份驗證不會通過網絡發送用戶密碼。相反,客戶端會發送密碼和附加數據的單向加密散列。雖然密碼不是通過網絡發送的,但摘要式身份驗證要求身份驗證容器可以使用明文密碼,以便它可以通過計算預期的摘要來驗證接收到的身份驗證器。

參考文獻:

-1

只有在數據庫中不存在有關用戶的數據時,才嘗試轉發到錯誤頁面。 如果您發現您的用戶使用下面的代碼來他重定向到他的「家」網頁

RequestDispatcher dis = request.getRequestDispatcher("relativeURL2Jsp"); 
dis.forward(request, response); 
1

使用try Servlet過濾器,無須配置JAAS和其他工作人員