【轉(zhuǎn)自】http://caterpillar.onlyfun.net/Gossip/JSPServlet/JSPServlet.htm
Web容器所提供的宣告安全管理,主要是針對(duì)URL來(lái)作防護(hù),將您所想要經(jīng)過(guò)驗(yàn)證、授權(quán)才可以存取的Web目錄、網(wǎng)頁(yè)或檔案等,在web.xml中作設(shè)定,當(dāng)有使用者想要存取時(shí),就必須輸入名稱與密碼進(jìn)行驗(yàn)證,並且必須被授于正確的權(quán)限才可存取。
例如若Web應(yīng)用程式的/serure/info.jsp僅能是foo的Role方可存取,則您可以在web.xml中設(shè)定如下:
- 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>讓您設(shè)定這個(gè)Web應(yīng)用程式中將參與的角色,若有多個(gè)角色,則可以用多個(gè)<security>加以設(shè)定。
在需要防護(hù)的URL部份,是在<url-patern>中指定,指定的方式從Web應(yīng)用程式根目錄開(kāi)始,若您想防護(hù)整個(gè)Web應(yīng)用程式,則可以使用/*來(lái)指定,若有多個(gè)URL需要防護(hù),則可以使用多個(gè)<url-pattern>。
<auth-constraint>中指定哪個(gè)Role可以存取指定URL的Role,若有多個(gè)Role則使用多個(gè)<role-name>來(lái)指定。
在<login-config>中,<auth-method>用來(lái)指定驗(yàn)證使用者的方式,指定BASIC的話將授用Http Basic Authentication,也就是丟出「WWW-Authenticate: Basic realm=""」這樣的回應(yīng)標(biāo)頭給瀏覽器,瀏覽器將顯示一個(gè)輸入對(duì)話方塊,要求使用者輸入名稱與密碼,若有輸入名稱與密碼,則瀏覽器會(huì)將之以 BASE64方式編碼,以「Authorization: Basic 編碼內(nèi)容」的請(qǐng)求標(biāo)頭傳給伺服器。
輸入名稱與密碼在伺服端可能通過(guò)驗(yàn)證,下一步是檢查登入的使用者其對(duì)應(yīng)的Role是否有足夠的權(quán)限存取資源,若否則會(huì)顯示403 Forbidden。
使用者與Role的對(duì)應(yīng),在Tomcat上,可以編輯tomcat-users.xml來(lái)設(shè)定,例如:
...
<tomcat-users>
? <role rolename="foo"/>
? <user username="caterpillar" password="123456" roles="foo"/>
? ...
</tomcat-users>
若是在Glassfish上,可以在Glassfish的管理介面上新增新的使用者並設(shè)定其群組,假設(shè)分別為caterpillar與orzGroup,則您可以在WEB-INF下編輯sun-web.xml,設(shè)定Role與Group的對(duì)應(yīng):
...
? <security-role-mapping>
??? <role-name>foo</role-name>
??? <group-name>orzGrooup</group-name>
? </security-role-mapping>
...
在設(shè)定<web-resource-collection>時(shí),預(yù)設(shè)是所有的HTTP請(qǐng)求都需要經(jīng)過(guò)驗(yàn)證與授權(quán),您可以使用<http-method>來(lái)設(shè)定哪些HTTP請(qǐng)求才需要經(jīng)過(guò)驗(yàn)證與授權(quán),例如設(shè)定GET與POST需要經(jīng)過(guò)驗(yàn)證與授權(quán):
...
?? <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>
...
要注意的是,一但設(shè)定<http-method>,表示有指定的HTTP請(qǐng)求才需要驗(yàn)證與授權(quán),但沒(méi)有被指定的則不需要,也就是說(shuō),若以上面的指定而言,GET、POST是需要驗(yàn)證與授權(quán)的,但HEAD、TRACE等方法則不需要。
文章來(lái)源:http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!785.entry