安全性是Web應用程序開發工作中最關鍵的問題之一
在基於servlet的應用程序裡
保護應用程序資源的辦法有兩種
一是對應用程序進行配置(web
xml)
二是使用Java代碼硬編碼到程序中
前一種方法使用配置文件
該方法很靈活
這是因為通過使用配置文件
無需改寫任何代碼就可以改變安全策略
是一種常見的手段
而Struts
是基於servlet技術的
所以Struts
的安全策略也可以使用配置文件進行靈活的配置
配置安全策略時
有兩個概念需要清楚的區分
用戶和角色
簡單的說用戶為使用計算機的人
可以是個人或組織
角色是一個抽象的概念
泛指職務或者權限
例如
張三
李四
王五三個人
有職員
主管和經理三個職務(權限)
張三是用戶
張三可以是主管職務
代表張三這個用戶含有主管的權利
不同的servlet容器所提供的用戶和角色管理機制是不相同的
我使用的是Tomcat服務器
它提供的用戶和角色管理機制文件是在其安裝目錄下的conf目錄中的tomcat
users
xml文件
可以在這個文件裡完成對用戶和角色的編輯
例如
<tomcatusers>
<role rolename=tomcat/>
<role rolename=role/>
<user username=tomcat password=tomcat roles=tomcat/>
<user username=both password=tomcat roles=tomcatrole/>
<user username=role password=tomcat roles=role/>
</tomcatusers>
這個文件定義了個角色(tomcat和role)和名用戶(tomcatboth和role)你可以在tomcatusersxml文件裡定義任意多個用戶和角色
使用Struts 保護應用程序的資源
Struts 應用程序的安全策略是通過部署webxml文件中的securityconstraint元素實現的該元素的語法定義
<!ELEMENT securityconstraint (displayname? webresourcecollection+ authconstraint? userdataconstraint?)>
<!ELEMENT displayname (#PCDATA)>
<!ELEMENT webresourcecollection (webresourcename description? urlpattern* httpmethod*)>
<!ELEMENT authconstraint (description? rolename*)>
<!ELEMENT userdataconstraint (description? transportguarantee)>
該語法說明了securityconstraint元素可以有一個可選的displayname子元素至少一個webresourcecollection子元素一個可選的authconstraint子元素和一個可選的userdataconstraint子元素
webresourcecollection子元素是用來列出打算保護的Web資源具體的做法是為這些資源設置URL限制它是通過設置webresourcecollection元素包含的子元素實現的
◆ webresourcename是與受保護資源相關聯的名稱該子元素為必須元素
◆ description對給定資源的描述這個子元素為可選元素
◆ urlpattern用來設置URL表達式與這個URL表達式相匹配的URL地址指向的資源將受到保護該子元素為至少有一個為必須元素
◆ httpmethod用來表明哪些HTTP方法將受到限制例如設置為GET那麼所有的GET請求就將受到限制該元素為可選元素
authconstraint元素用於指定可以訪問該資源用戶角色集合如果沒有指定authconstraint元素就將安全約束應用於所有角色它包含下面幾個子元素
◆ description描述該元素是可選元素
◆ rolename可以訪問保護資源的用戶角色該元素可以有多個
◆ userdataconstraint元素用來設置怎樣保護在客戶端和Web容器之間傳遞的數據
◆ description 描述可選元素
◆ transportguarantee 該元素有以下幾個值
NONE這意味著應用不需要傳輸保證
INTEGRAL意味著服務器和客戶端之間的數據必須以某種方式發送而且在傳送中數據不能被篡改
CONFIDENTIAL這意味著傳輸的數據必須加密
配置完畢securityconstraint元素的基本信息大致為下面的格式
<securityconstraint>
<webresourcecollection>
<webresourcename>Admin Arew</webresourcename>
<urlpattern>*action</urlpattern>
</webresourcecollection>
<authconstraint>
<rolename>myeclipseWeb</rolename>
</authconstraint>
</securityconstraint>
這個securityconstraint元素的效果為只要與表達式*action匹配的請求不是來自擁有myeclipseWeb權限的用戶Web容器就會阻斷它在這裡還可以使用httpmethod元素阻斷特定方法的請求因為沒有使用會阻斷所有方法提交的請求
設置完安全策略後還需要設置讓用戶有機會提供證明證明自己有權限訪問這個受限資源的登陸方法允許使用的登陸方法使用loginconfig元素設置下面為loginconfig元素的語法定義
<!ELEMENT loginconfig (authmethod? realmname? formloginconfig?)>
<!ELEMENT authmethod (#PCDATA)>
<!ELEMENT realmname (#PCDATA)>
<!ELEMENT formloginconfig (formloginpage formerrorpage)>
loginconfig子元素的描述如下
◆ authmethod指定用來驗證用戶身份的方法它的值為下面的一個BASICDIGESTFORM或 CLIENTCERT
◆ realmname指定HTTP Basic驗證中在標准登陸框中顯示的一條提示
◆ formloginconfig元素是在<authmethod>元素值為FORM時使用的它是指定基於表單的登錄中應該使用的登錄頁面和出錯頁面如果沒有使用基於表單的驗證則忽略這些元素這個元素的定義如下其中formloginpage用於指定顯示登錄頁面的資源路徑 formerrorpage則用於指定用戶登錄失敗時顯示出錯頁面的資源路徑
<!ELEMENT formloginconfig (formloginpage formerrorpage)>
<!ELEMENT formloginpage (#PCDATA)>
<!ELEMENT formerrorpage (#PCDATA)>
設置完登陸方法後還應該使用securityrole元素注冊允許用來訪問受保護資源所有角色在該元素內部使用一個rolename子元素來注冊一個角色例如
<securityrole>
<rolename>myeclipseWeb</rolename>
</securityrole>
注冊了一個myeclipseWeb的角色
演示示例使用BASIC登陸方法驗證用戶身份
我使用的Servlet容器是Tomcat找到它的目錄下conf目錄中的tomcatusersxml文件打開內容如下
<?xml version= encoding=utf?>
<tomcatusers>
<role rolename=myeclipseWeb/>
<role rolename=myeclipseWebservices/>
<user username=webservices password=webservicespwd roles=myeclipseWebservices/>
<user username=admin password=adminpwd roles=myeclipseWebmyeclipseWebservices/>
<user username=web password=webpwd roles=myeclipseWeb/>
</tomcatusers>
我使用的IDE是myEclipse它配置好Tomcat下的tomcatusersxml文件內容如上我直接使用它了你也可以添加自己的角色和用戶該文件定義了個角色和個用戶每一個用戶都由自己的角色(或者說權限可以有多重權限)
創建Web項目找到webxml配置它使它支持Struts 並且啟動Struts 的安全策略
<?xml version= encoding=UTF?>
<webapp id=WebApp_ version=
xmlns=
xmlns:xsi=instance
xsi:schemaLocation=;app__xsd>
<displayname>Struts Blank</displayname>
<filter>
<filtername>struts</filtername>
<filterclass>orgapachestrutsdispatcherngfilterStrutsPrepareAndExecuteFilter</filterclass>
</filter>
<filtermapping>
<filtername>struts</filtername>
<urlpattern>/*</urlpattern>
</filtermapping>
<welcomefilelist>
<welcomefile>l</welcomefile>
</welcomefilelist>
<! 配置應用程序需要保護的資源與什麼角色才可以訪問它 >
<securityconstraint>
<webresourcecollection>
<webresourcename>Admin Arew</webresourcename>
<urlpattern>*action</urlpattern>
</webresourcecollection>
<authconstraint>
<rolename>myeclipseWeb</rolename>
</authconstraint>
</securityconstraint>
<! 注冊可以訪問保護資源的角色 >
<securityrole>
<rolename>myeclipseWeb</rolename>
</securityrole>
<securityrole>
<rolename>myeclipseWebservices</rolename>
</securityrole>
<! 設置登錄方法 >
<loginconfig>
<authmethod>BASIC</authmethod>
<realmname>User Basic Authentication</realmname>
</loginconfig>
</webapp>
創建接收一個字段信息的動作類
public class SecureAction extends ActionSupport {
private static final long serialVersionUID = L;
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
thisusername = username;
}
@Override
public String execute()
{
return SUCCESS;
}
}
創建strutsxml配置文件聲明動作
<?xml version= encoding=UTF ?>
<!DOCTYPE struts PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
dtd>
<struts>
<package name=securePackage extends=strutsdefault>
<action name=secure class=strutsactionSecureAction>
<result name=success>/indexjsp</result>
</action>
</package>
</struts>
創建輸入頁面inputjsp和結果頁面indexjsp
inputjsp:
<body>
<s:form action=secure>
<s:textfield name=username label=Enter your name></s:textfield>
<s:submit value=submit></s:submit>
</s:form>
</body>
indexjsp
<body>
<s:property value=username/>Welcome
</body>
測試效果在浏覽器輸入得到如下界面輸入Tom點擊submit按鈕查看效果
看到了登陸框了吧此時我們要訪問的資源是一個受限資源所以要求權限驗證還記得我們的用戶表吧查看用戶表輸入用戶信息查看結果
輸入webservices與webservicespwd的用戶信息
提示了一個錯誤這是因為雖然用戶信息正確但是webservices用戶的沒有myeclipseWeb權限
這次輸入一個不存在的用戶信息
這次獲得了一個錯誤這是登陸失敗的提示結果這裡會因浏覽器的不同而需要不同次數的失敗登陸才會得到這個結果
接下來輸入一個正確的用戶並且擁有webservices權限的用戶信息
點擊確定獲得如下結果
可以看到我們成功的訪問了受保護的資源若要傳中文字解決方案我已經在前面配置Struts時介紹過了需要修改Struts 默認的編碼方式還需要修改頁面的編碼方式都改為GBK
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28240.html