JavaServer Pages 和 servlets 有幾種可用的機制可以使 web 開發(fā)人員用來保護應(yīng)用程序。資源可以通過在應(yīng)用程序部署描述中對它們進行識別并且為它們分配一個角色來聲明式地保護它們。
有幾種級別的身份驗證是可用的,從使用基本標(biāo)示符的基本驗證到復(fù)雜的使用證書的密碼驗證。
Servlet 規(guī)范中的認證機制使用的是一項被稱為基于角色的安全技術(shù)。該想法是你通過角色來創(chuàng)建角色和限制資源,而不是限制用戶級別的資源。
你可以定義在文件 tomcat-users.xml 中定義不同的角色,該文件位于 Tomcat 的主頁目錄中的 conf. 中。此文件的一個示例如下所示:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="admin" password="secret" roles="admin,manager"/>
</tomcat-users>
這個文件在用戶名稱、密碼和角色之間定義了一個簡單的映射。請注意,一個給定的用戶可能有多個角色,例如,在“tomcat”角色中的用戶名=“both”,角色是“role1”。
一旦你識別和定義了不同的角色,一個基于角色的安全限制可以通過使用
下面是 web.xml 中一個簡單的示例:
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>
SecuredBookSite
</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
...
</web-app>
以上條目將意味著:
任何 通過 /secured/* 對一個 URL匹配 的HTTP GET 或者 POST 請求都將被安全限制所接受。
一個有著管理員角色的人是可以訪問被保護的資源的。
現(xiàn)在,如果你試圖瀏覽任何包含 /security 目錄的 URL,它將顯示一個詢問用戶名和密碼的對話框。如果你提供一個用戶“admin”和密碼“secrer”,那么只有你可以通過 /secured/* 訪問上面的 URL,因為我們已經(jīng)定義了用戶為管理員角色,而該角色是有權(quán)訪問該資源的。
當(dāng)時使用表單身份驗證方法時,你必須提供一個登錄表單來提示用戶輸入用戶名和密碼。下面是一個簡單登錄頁面 login.jsp 的代碼,用來創(chuàng)建一個相同目的的表單:
<html> <body bgcolor="#ffffff"> <form method="POST" action="j_security_check"> <table border="0"> <tr> <td>Login</td> <td><input type="text" name="j_username"></td> </tr> <tr> <td>Password</td> <td><input type="password" name="j_password"></td> </tr> </table> <input type="submit" value="Login!"> </center> </form> </body> </html>
在這里,你必須確保登錄表單中必須包含以 j_username 和 j_password 命名的表單元素。在