JSP的安全性

easonjim發表於2017-06-09

以下內容引用自http://wiki.jikexueyuan.com/project/jsp/security.html

JavaServer Pages和Servlets有幾種可用的機制可以使Web開發人員用來保護應用程式。資源可以通過在應用程式部署描述中對它們進行識別並且為它們分配一個角色來宣告式地保護它們。

有幾種級別的身份驗證是可用的,從使用基本標示符的基本驗證到複雜的使用證照的密碼驗證。

一、基本角色的驗證

Servlet規範中的認證機制使用的是一項被稱為基於角色的安全技術。該想法是通過角色來建立角色和限制資源,而不是限制使用者級別的資源。

可以定義在檔案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”。

一旦識別和定義了不同的角色,一個基於角色的安全限制可以通過使用<security-constraint>元素被放置在不同的Web應用程式中,該元素在WEB-INF目錄中的web.xml檔案中是可用的。

下面是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請求都將被安全限制所接受。

  • 一個有著管理員角色的人是可以訪問被保護的資源的。

  • 最後,login-config元素是用來描述身份驗證的BASIC形式。

現在,如果試圖瀏覽任何包含/security目錄的URL,它將顯示一個詢問使用者名稱和密碼的對話方塊。如果提供一個使用者“admin”和密碼“secrer”,那麼可以通過/secured/*訪問上面的URL,因為已經定義了使用者為管理員角色,而該角色是有權訪問該資源的。

二、基於表單的身份驗證

當時使用表單身份驗證方法時,必須提供一個登入表單來提示使用者輸入使用者名稱和密碼。下面是一個簡單登入頁面login.jsp的程式碼,用來建立一個相同目的的表單:

<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命名的表單元素。在<form>標籤中的動作必須是j_security_check。POST必須以表單的方法來使用。同時必須修改<login-config>標籤來指定auth-method作為表單:

<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>FORM</auth-method>
      <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
      </form-login-config>
    </login-config>
...
</web-app>

現在,當試圖用URL:/secured/*訪問任何資源時,它將顯示以上的表單,要求使用者id和密碼。當容器看到“j_security_check”動作時,它會使用一些內部機制來對呼叫方進行身份驗證。

如果登入成功,呼叫者會被授權訪問安全資源,那麼從那時起容器會用一個session-id來識別呼叫者的登入會話。容器會用一個包含session-id的cookie來保持這個登入會話。伺服器將cookie傳送回客戶端,並且只要呼叫者使用後續的請求顯示這個cookie時,那麼容器就會知道這個呼叫者是誰。

如果登入失敗,那麼伺服器將發回由form-error-page設定識別的頁面。

這裡,j_security_check是登入表單中使用基於表單登入的應用程式必須指定的一個動作。在相同的表單中,應該有一個名為j_username的文字輸入控制元件和一個名為j_password的密碼輸入控制元件。當看到這,這意味著表單中包含的資訊將會被提交到伺服器,伺服器將會檢查使用者名稱和密碼。這一步如何實現是由伺服器指定的。

檢查 Standard Realm Implementations來來了解j_security_check是如何為Tomcat容器工作的。

三、Servlet/JSP中的程式性安全

HttpServletRequest物件提供了以下方法,它可以在執行時用於挖掘安全資訊:

方法 描述

String getAuthType()

getAuthType()方法返回一個字串物件,代表用於保護Servlet的身份驗證方案的名稱。

boolean isUserInRole(java.lang.String role)

isUserInRole()返回一個布林型的值:如果使用者在給定的角色中值為真,否則值為假。

String getProtocol()

getProtocol()方法返回一個字串物件,代表使用者傳送請求的協議。它的值可以用來檢查確定一個保護協議是否被使用。

boolean isSecure()

isSecure()方法返回一個布林型的值,代表請求是否是使用的HTTPS協議。真值代表是並且連線是安全的。假值代表不是。

Principle getUserPrinciple()

getUserPrinciple()方法返回一個java.security.Principle物件,該物件包含當前已驗證使用者的使用者名稱。

例如,一個JavaServer Page連線的是管理員頁面,可能會使用以下程式碼:

<% if (request.isUserInRole("manager")) { %><a href="managers/mgrreport.jsp">Manager Report</a><a href="managers/personnel.jsp">Personnel Records</a><% } %>

在一個JSP或者Servlet裡,通過檢查使用者的角色,可以自定義Web網頁來顯示只有使用者自己可以訪問的條目。如果需要使用者名稱作為身份驗證表單的輸入,那麼可以在請求物件中呼叫getRemoteUser方法。

==>如有問題,請聯絡我:easonjim#163.com,或者下方發表評論。<==


相關文章