驗證是檢驗某個人是否是他/她所聲稱的那個人的過程。在Servlet/JSP應用程序中,驗證一般是通過要求用戶輸入用戶名和密碼來完成的。
授權主要是確定一個用戶具有什么樣的訪問級別。它使用于包含多個訪問區域的應用程序,使用戶能夠訪問應用程序的某一部分,但是不能訪問其他部分。例如,網上商店可以分為公共區(供一般的公共瀏覽和查找商品),買家區(供已注冊用戶下單用),以及需要最高訪問級別的管理區。不僅管理員用戶自身也需要進行驗證,并且還必須是已經被允許訪問管理區的用戶才行。訪問級別經常被稱作角色。
每一種兼容的Servlet/JSP容器都必須提供一種定義用戶和角色的方法。如果你使用的是Tomcat,就可以通過編輯conf目錄下的tomcat-users.xml文件來創建用戶和角色。tomcat-users.xml文件范例如下:
<?xml version=’1.0’ encoding=’utf-8’?>
<tomcat-users>
<role rolename=”manager”/>
<role rolename=”member”/>
<user username=”tom” password=”secret” roles=”manager,member”/>
<user username=”jerry” password=”secret” roles=”member”/>
</tomcat-users>
tomcat-users.xml文件是一個帶有tomcat-users根源素的XML文檔。其中有role和user元素。role元素定義角色,user元素定義用戶。role元素有一個rolename屬性,用來指定角色的名稱。user元素有username、password和roles屬性。username屬性指定用戶名稱,password屬性指定密碼,roles屬性則指定該用戶所屬的一個或多個角色
前面講過,將靜態資源和JSP頁面保存在WEB-INF或其下的某一個目錄下,可以講他們隱藏起來。放在這里的資源無法直接通過輸入網址而訪問到,但是仍然可以通過一個Servlet或者JSP頁面跳轉到那里。雖然這種方法簡單直接,但缺點是藏在這里的資源就永遠被藏起來了。它們永遠無法被直接訪問到。如果只是想避免未授權的用戶訪問這些資源,那么可以講它們放在應用程序目錄下的某一個目錄中,并在部署描述符中聲明一個安全性約束。
security-constraint元素用于指定一個資源集合,以及可以訪問這些資源的一個或多個角色。這個元素可以有兩個子元素:web-resource-collection和auth-constraint。
web-resource-collection元素用于指定一個資源集合,并且可以帶有以下元素:web-resource-name、description、url-pattern、http-method和http-method-ommission。
web-resource-collection元素可以帶有多個url-pattern元素,每一個子元素都表示所包含安全性約束實行的一種URL模式。我們可以在url-pattern元素中用一個星號(*)表示一種特定的資源類型(如*.jsp),或者表示某個目錄下的所有資源(如/*或/jsp/*)。但是這兩種不能合二為一,比如,無法表示某一個特定目錄下的某一種特定的類型。因此,如果用/jsp/*.jsp表示jsp目錄下的所有jsp頁面,那么這個URL模式將是無效的,而是要用/jsp/*來表示,但是這樣又限制了jsp目錄下那些非jsp的頁面。
http-method元素中定義了一個HTTP方法,包含的安全性約束即應用到該方法中。例如,web-resource-collection元素帶有一個GET http-method元素,表示web-resource-collection元素只應用于HTTP的get方法。包含資源集合的安全性約束并不能保護其他的HTTP方法,例如Post方法和Put方法。如果沒有http-method元素,表示這個安全性約束將會限制對所有HTTP方法的訪問。同一個web-resource-collection元素中可以帶有多個http-method元素。
http-method-omission元素指定的是不再所包含安全性約束中的HTTP方法。因此,指定<http-method-omission>GET</http-method-omission>限制了對除GET之外的所有HTTP方法的訪問。
http-method和http-method-omission元素不能同時出現在同一個web-resource-collection元素中。
部署描述符中可以有多個security-constraint元素。如果安全性約束元素中沒有auth-constraint元素,那么這個資源集合將不能受到保護。此外,如果你指定了一個沒有在容器中定義的角色,那么將沒有人能夠直接訪問這個資源集合。但是,你還是可以通過一個Servlet或者JSP頁面跳轉到集合中的某個資源。
舉個例子。下面的web.xml文件中的security-constraint元素限制了對所有jsp頁面的訪問。由于auth-constraint元素中沒有包含role-name元素,因此不能通過url來訪問這些資源。
Servlet容器會發送一條HTTP403錯誤,溫柔地告訴你:Access to the requested resource has been denied(禁止訪問)。
學會如何對一個資源集合強加安全性約束之后,還應該知道如何對訪問這些資源的用戶進行驗證。對于聲明式保護的資源,可以在部署描述符中使用security-constraint元素,通過使用HTTP 1.1提供的解決方案來完成驗證:基本訪問驗證和摘要訪問驗證。此外,也可以使用基于表單的訪問驗證。
基本訪問驗證,簡稱基本驗證,是一種接受用戶名和密碼的HTTP驗證。在基本訪問驗證中,如果用戶訪問受保護的資源,將會遭到服務器的拒絕,并返回一個401(未授權)響應。該響應中包含一個WWW-Authenticate標頭,其中至少包含一個適用于被請求資源的角色,例如:
HTTP/1.1 401 Authorization Required
Server: Apache-Coyote/1.1
Date: Wed, 21 Dec 2011 11:32:09 GMT
WWW-Authenticate: Basic realm=”Members Only”
隨后瀏覽器屏幕上回顯示一個登錄對話框,供用戶輸入用戶名和密碼。當用戶單擊Login登錄按鈕時,用戶名后面會被添上一個冒號,并和密碼結合在一起。這個字符串被送到服務器之前,將先用Base64算法進行編碼。登錄成功之后,服務器就會發出被請求的資源。
Base64是一種很弱的算法,因此Base64消息很容易被破解。因此,要考慮使用摘要訪問來代替。
下面展示了如何使用基本訪問驗證。第一個security-constraint元素是避免JSP頁面被直接訪問。第二個是限制只有manager和member角色的用戶才能訪問Servlet1 Servlet。Servlet1類是一個跳轉到1.jsp頁面的簡單Servlet
web.xml由于映射到Servlet1的auth-constraint元素指定了manager和member兩種角色,因此通過tom或者jerry都可以登錄。