JSP - 安全性



JavaServer Pages 和 servlet 為 Web 開發人員提供了多種保護應用程式的機制。透過在應用程式部署描述符中標識資源併為其分配角色,可以宣告式地保護資源。

有多種身份驗證級別可供選擇,從使用識別符號和密碼的基本身份驗證到使用證書的複雜身份驗證。

基於角色的身份驗證

servlet 規範中的身份驗證機制使用一種稱為基於角色的安全的技術。其思想是,與其在使用者級別限制資源,不如建立角色並按角色限制資源。

您可以在位於 Tomcat 主目錄下的 conf 資料夾中的tomcat-users.xml檔案中定義不同的角色。下面顯示此檔案的一個示例:

<?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>

此檔案定義了使用者名稱、密碼角色之間簡單的對映。請注意,給定使用者可能具有多個角色;例如,使用者名稱 = "both" 同時具有 "tomcat" 角色和 "role1" 角色。

定義不同的角色後,可以使用web.xml檔案(位於 WEB-INF 目錄下)中的<security-constraint>元素對不同的 Web 應用程式資源設定基於角色的安全限制。

以下是 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"和密碼"secret",則您可以訪問與/secured/*匹配的 URL,因為我們已將具有管理員角色的使用者 admin 定義為允許訪問此資源。

基於表單的身份驗證

當您使用 FORM 身份驗證方法時,必須提供登入表單以提示使用者輸入使用者名稱和密碼。以下是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!">
         
      </form>
      
   </body>
</html>

您必須確保登入表單必須包含名為j_usernamej_password的表單元素。<form>標籤中的 action 必須為j_security_check。必須使用POST作為表單方法。同時,您需要修改<login-config>標籤以將 auth-method 指定為 FORM:

<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是使用基於表單登入的應用程式必須為登入表單指定的 action。在同一表單中,還應該有一個名為j_username的文字輸入控制元件和一個名為j_password密碼輸入控制元件。當您看到這一點時,這意味著表單中包含的資訊將提交到伺服器,伺服器將檢查名稱和密碼。這如何完成是特定於伺服器的。

檢視標準 Realm 實現以瞭解j_security_check如何在 Tomcat 容器中工作。

Servlet/JSP 中的程式化安全性

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

序號 方法和描述
1

String getAuthType()

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

2

boolean isUserInRole(java.lang.String role)

isUserInRole()方法返回一個布林值:如果使用者具有給定角色,則為 true;如果沒有,則為 false。

3

String getProtocol()

getProtocol()方法返回一個 String 物件,該物件表示用於傳送請求的協議。此值可以檢查以確定是否使用了安全協議。

4

boolean isSecure()

isSecure()方法返回一個布林值,表示請求是否使用 HTTPS 發出。值為 true 表示已使用 HTTPS,連線安全。值為 false 表示未使用 HTTPS。

5

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 中使用者的角色,您可以自定義網頁以僅向用戶顯示她可以訪問的專案。如果您需要使用者在身份驗證表單中輸入的使用者名稱,可以在請求物件中呼叫getRemoteUser方法。

廣告
© . All rights reserved.