現在,可以指示伺服器使用何種驗證方法了。“了不起,”你說道,“除非我能指定一個來收到保護的URL,否則沒有多大用處。”沒錯。指出這些URL並說明他們應該得到何種保護正是security-constriaint元素的用途。此元素在web.xml中應該出現在login-config的緊前面。它包含是個可能的子項目,分別是:web-resource-collection、auth-constraint、user-data-constraint和display-name。
下面各小節對它們進行介紹。
web-resource-collection
此元素確定應該保護的資源。所有security-constraint元素都必須包含至少一個web-resource-collection項。此元素由一個給出任意標識名稱的web-resource-name元素、一個確定應該保護的URL的url-pattern元素、一個指出此保護所適用的HTTP命令(GET、POST等,預設為所有方法)的http-method元素和一個提供資料的可選description元素組成。例如,下面的Web-resource-collection項(在security-constratint元素內)指出Web應用的proprietary目錄中所有文檔應該受到保護。
<security-constraint>
<web-resource-coolection>
<web-resource-name>Proprietary</web-resource-name>
<url-pattern>/propritary/*</url-pattern>
</web-resource-coolection>
<!-- ... -->
</security-constraint>
重要的是應該注意到,url-pattern僅適用於直接存取這些資源的客戶機。特別是,它不適合於通過MVC體繫結構利用RequestDispatcher來訪問的頁面,或者不適合於利用類似jsp:forward的手段來訪問的頁面。這種不勻稱如果利用得當的話很有好處。例如,servlet可利用MVC體繫結構尋找資料,把它放到bean中,發送請求到從bean中提取資料的JSP頁面並顯示它。我們希望保證決不直接存取受保護的JSP頁面,而只是通過建立該頁面將使用的bean的servlet來訪問它。url-pattern和auth-contraint元素可通過聲明不允許任何使用者直接存取JSP頁面來提供這種保證。但是,這種不勻稱的行為可能讓開發人員放鬆警惕,使他們偶然對應受保護的資源提供不受限制的訪問。
auth-constraint
儘管web-resource-collention元素質出了哪些URL應該受到保護,但是auth-constraint元素卻指出哪些使用者應該具有受保護資源的訪問權。此元素應該包含一個或多個標識具有存取權限的使用者類別role-name元素,以及包含(可選)一個描述角色的description元素。例如,下面web.xml中的security-constraint元素部門規定只有指定為Administrator或Big
Kahuna(或兩者)的使用者具有指定資源的訪問權。
<security-constraint>
<web-resource-coolection> ... </web-resource-coolection>
<auth-constraint>
<role-name>administrator</role-name>
<role-name>kahuna</role-name>
</auth-constraint>
</security-constraint>
重要的是認識到,到此為止,這個過程的可移植部分結束了。伺服器怎樣確定哪些使用者處於任何角色以及它怎樣存放使用者的口令,完全有賴於具體的系統。
例如,Tomcat使用install_dir/conf/tomcat-users.xml將使用者名稱與角色名稱和口令相關聯,正如下面例子中所示,它指出使用者joe(口令bigshot)和jane(口令enaj)屬於administrator和kahuna角色。
<tomcat-users>
<user name="joe" password="bigshot" roles="administrator,kahuna" />
<user name="jane" password="enaj" roles="kahuna" />
</tomcat-users>
user-data-constraint
這個可選的元素指出在訪問相關資源時使用任何傳輸層保護。它必須包含一個transport-guarantee子項目(合法值為NONE、INTEGRAL或CONFIDENTIAL),並且可選地包含一個description元素。transport-guarantee為NONE值將對所用的通訊協議不加限制。INTEGRAL值表示資料必須以一種防止截取它的人閱讀它的方式傳送。雖然原理上(並且在未來的HTTP版本中),在INTEGRAL和CONFIDENTIAL之間可能會有差別,但在當前實踐中,他們都只是簡單地要求用SSL。例如,下面指示伺服器只允許對相關資源做HTTPS串連:
<security-constraint>
<!-- ... -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
display-name
security-constraint的這個很少使用的子項目給予可能由GUI工具使用的安全約束項一個名稱