【转自】http://caterpillar.onlyfun.net/Gossip/JSPServlet/JSPServlet.htm
Web容器所提供的宣告安全管理,主要是針對URL來作防護,將您所想要經過驗證、授權才可以存取的Web目錄、網頁或檔案等,在web.xml中作設定,當有使用者想要存取時,就必須輸入名稱與密碼進行驗證,並且必須被授于正確的權限才可存取。
例如若Web應用程式的/serure/info.jsp僅能是foo的Role方可存取,則您可以在web.xml中設定如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<security-role>
<role-name>foo</role-name>
</security-role>
<security-constraint>
<display-name>SecurityConstraint</display-name>
<web-resource-collection>
<web-resource-name>Secret Information</web-resource-name>
<url-pattern>/secure/info.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>foo</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>file</realm-name>
</login-config>
</web-app>
<security-role>讓您設定這個Web應用程式中將參與的角色,若有多個角色,則可以用多個<security>加以設定。
在需要防護的URL部份,是在<url-patern>中指定,指定的方式從Web應用程式根目錄開始,若您想防護整個Web應用程式,則可以使用/*來指定,若有多個URL需要防護,則可以使用多個<url-pattern>。
<auth-constraint>中指定哪個Role可以存取指定URL的Role,若有多個Role則使用多個<role-name>來指定。
在<login-config>中,<auth-method>用來指定驗證使用者的方式,指定BASIC的話將授用Http Basic Authentication,也就是丟出「WWW-Authenticate: Basic realm=""」這樣的回應標頭給瀏覽器,瀏覽器將顯示一個輸入對話方塊,要求使用者輸入名稱與密碼,若有輸入名稱與密碼,則瀏覽器會將之以 BASE64方式編碼,以「Authorization: Basic 編碼內容」的請求標頭傳給伺服器。
輸入名稱與密碼在伺服端可能通過驗證,下一步是檢查登入的使用者其對應的Role是否有足夠的權限存取資源,若否則會顯示403 Forbidden。
使用者與Role的對應,在Tomcat上,可以編輯tomcat-users.xml來設定,例如:
...
<tomcat-users>
<role rolename="foo"/>
<user username="caterpillar" password="123456" roles="foo"/>
...
</tomcat-users>
若是在Glassfish上,可以在Glassfish的管理介面上新增新的使用者並設定其群組,假設分別為caterpillar與orzGroup,則您可以在WEB-INF下編輯sun-web.xml,設定Role與Group的對應:
...
<security-role-mapping>
<role-name>foo</role-name>
<group-name>orzGrooup</group-name>
</security-role-mapping>
...
在設定<web-resource-collection>時,預設是所有的HTTP請求都需要經過驗證與授權,您可以使用<http-method>來設定哪些HTTP請求才需要經過驗證與授權,例如設定GET與POST需要經過驗證與授權:
...
<web-resource-collection>
<web-resource-name>Secret Information</web-resource-name>
<url-pattern>/secure/info.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
...
要注意的是,一但設定<http-method>,表示有指定的HTTP請求才需要驗證與授權,但沒有被指定的則不需要,也就是說,若以上面的指定而言,GET、POST是需要驗證與授權的,但HEAD、TRACE等方法則不需要。
文章来源:
http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!785.entry