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