天天看點

Struts 2應用程式安全功能的配置詳解

安全性是Web應用程式開發工作中最關鍵的問題之一。在基于servlet的應用程式裡,保護應用程式資源的辦法有兩種:一是對應用程式進行配置(web.xml),二是使用Java代碼寫死到程式中。前一種方法使用配置檔案,該方法很靈活,這是因為通過使用配置檔案,無需改寫任何代碼就可以改變安全政策,是一種常見的手段。而Struts 2是基于servlet技術的,是以Struts 2的安全政策也可以使用配置檔案進行靈活的配置。 

  配置安全政策時,有兩個概念需要清楚的區分 ,使用者和角色,簡單的說使用者為使用計算機的人,可以是個人或組織。角色是一個抽象的概念,泛指職務或者權限。例如,張三,李四,王五三個人,有職員、主管和經理三個職務(權限),張三是使用者,張三可以是主管職務,代表張三這個使用者含有主管的權利。

<tomcat-users>

    <role rolename="tomcat"/>

    <role rolename="role1"/>

    <user username="tomcat" password="tomcat" roles="tomcat"/>

    <user username="both" password="tomcat" roles="tomcat,role1"/>

    <user username="role1" password="tomcat" roles="role1"/>

</tomcat-users>

  這個檔案定義了2個角色(tomcat和role1)和3名使用者(tomcat、both和role1)。你可以在tomcat-users.xml檔案裡定義任意多個使用者和角色。

  <b>使用Struts 2保護應用程式的資源</b>

  Struts 2應用程式的安全政策是通過部署web.xml檔案中的security-constraint元素實作的,該元素的文法定義:

&lt;!ELEMENT security-constraint (display-name?, web-resource-collection+, auth-constraint?, user-data-constraint?)&gt;

&lt;!ELEMENT display-name (#PCDATA)&gt;

&lt;!ELEMENT web-resource-collection (web-resource-name, description?, url-pattern*, http-method*)&gt;

&lt;!ELEMENT auth-constraint (description?, role-name*)&gt;

&lt;!ELEMENT user-data-constraint (description?, transport-guarantee)&gt;

   該文法說明了,security-constraint元素可以有一個可選的display-name子元素,至少一個web-resource-collection子元素,一個可選的auth-constraint子元素和一個可選的user-data-constraint子元素。

  <b>web-resource-collection子元素</b>是用來列出打算保護的Web資源,具體的做法是為這些資源設定URL限制,它是通過設定web-resource-collection元素包含的子元素實作的:

  ①web-resource-name:是與受保護資源相關聯的名稱。該子元素為必須元素。

  ②description:對給定資源的描述。這個子元素為可選元素。

  ③url-pattern:用來設定URL表達式,與這個URL表達式相比對的URL位址指向的資源将受到保護。該子元素為至少有一個,為必須元素。

  ④http-method:用來表明哪些HTTP方法将受到限制,例如設定為GET那麼所有的GET請求就将受到限制。該元素為可選元素。

  <b>auth-constraint元素</b>用于指定可以通路該資源使用者角色集合。如果沒有指定auth-constraint元素,就将安全限制應用于所有角色。它包含下面幾個子元素:

  ①description:描述。該元素是可選元素。

  ②role-name:可以通路保護資源的使用者角色。該元素可以有多個。

  <b>user-data-constraint元素</b>用來設定怎樣保護在用戶端和Web容器之間傳遞的資料。

  ①description: 描述。可選元素。

     ②transport-guarantee :該元素有以下幾個值

     NONE,這意味着應用不需要傳輸保證。

     CONFIDENTIAL,這意味着傳輸的資料必須加密。

  配置完畢security-constraint元素的基本資訊,大緻為下面的格式:

&lt;security-constraint&gt;

    &lt;web-resource-collection&gt;

        &lt;web-resource-name&gt;Admin Arew&lt;/web-resource-name&gt;

        &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;

    &lt;/web-resource-collection&gt;

    &lt;auth-constraint&gt;

        &lt;role-name&gt;myeclipseWeb&lt;/role-name&gt;

    &lt;/auth-constraint&gt;

&lt;/security-constraint&gt;

         這個security-constraint元素的效果為:隻要與表達式"*.action"比對的請求不是來自擁有"myeclipseWeb"權限的使用者,Web容器就會阻斷它。在這裡還可以使用http-method元素,阻斷特定方法的請求,因為沒有使用會阻斷所有方法送出的請求。

  設定完安全政策後,還需要設定讓使用者有機會提供證明,證明自己有權限通路這個受限資源的登陸方法。允許使用的登陸方法使用login-config元素設定,下面為login-config元素的文法定義:

&lt;!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)&gt;

&lt;!ELEMENT auth-method (#PCDATA)&gt;

&lt;!ELEMENT realm-name (#PCDATA)&gt;

&lt;!ELEMENT form-login-config (form-login-page, form-error-page)&gt;

   <b>login-config子元素</b>的描述如下:

   auth-method指定用來驗證使用者身份的方法。它的值為下面的一個:BASIC、DIGEST、FORM或 CLIENT-CERT

   realm-name指定HTTP Basic驗證中在标準登陸框中顯示的一條提示。

  form-login-config元素是在元素值為"FORM"時使用的。它是指定基于表單的登入中應該使用的登入頁面和出錯頁面。如果沒有使用基于表單的驗證,則忽略這些元素。這個元素的定義如下,其中form-login-page用于指定顯示登入頁面的資源路徑, form-error-page則用于指定使用者登入失敗時顯示出錯頁面的資源路徑。

&lt;!ELEMENT form-login-page (#PCDATA)&gt;

&lt;!ELEMENT form-error-page (#PCDATA)&gt;

  設定完登陸方法後,還應該使用security-role元素,注冊允許用來通路受保護資源所有角色。在該元素内部使用一個role-name子元素來注冊一個角色。例如:

&lt;security-role&gt;

    &lt;role-name&gt;myeclipseWeb&lt;/role-name&gt;

&lt;/security-role&gt;

  注冊了一個"myeclipseWeb"的角色。

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/735598,如需轉載請自行聯系原作者