鍍金池/ 教程/ Java/ JSP - 安全性
JSP - 異常處理
JSP - 標(biāo)準(zhǔn)標(biāo)簽庫
JSP - 操作
JSP - 語法
JSP - 概述
JSP - 過濾器
JSP - 文件上傳
JSP - 指令
JSP - 訪問數(shù)據(jù)庫
JSP - 國際化
JSP - 隱式對象
JSP - 面試問題
JSP - 體系結(jié)構(gòu)
JSP - 發(fā)送電子郵件
JSP - 客戶端請求
JSP - 服務(wù)器響應(yīng)
JSP - 表達式語言
JSP - 自定義標(biāo)簽
JSP - HTTP 狀態(tài)碼
JSP - 調(diào)試
JSP - XML 數(shù)據(jù)
JSP - 有用的資源
JSP - 處理日期
JSP - 生命周期
JSP - 會話跟蹤
JSP - JavaBeans
JSP - 自動刷新
JSP - 頁面重定向
JSP - 點擊計數(shù)器
JSP - 安全性
JSP - Cookies 處理
JSP - 環(huán)境配置
JSP - 表單處理

JSP - 安全性

JavaServer Pages 和 servlets 有幾種可用的機制可以使 web 開發(fā)人員用來保護應(yīng)用程序。資源可以通過在應(yīng)用程序部署描述中對它們進行識別并且為它們分配一個角色來聲明式地保護它們。

有幾種級別的身份驗證是可用的,從使用基本標(biāo)示符的基本驗證到復(fù)雜的使用證書的密碼驗證。

基本角色的驗證

Servlet 規(guī)范中的認證機制使用的是一項被稱為基于角色的安全技術(shù)。該想法是你通過角色來創(chuàng)建角色和限制資源,而不是限制用戶級別的資源。

你可以定義在文件 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”。

一旦你識別和定義了不同的角色,一個基于角色的安全限制可以通過使用 元素被放置在不同的 web 應(yīng)用程序中,該元素在 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 形式。

現(xiàn)在,如果你試圖瀏覽任何包含 /security 目錄的 URL,它將顯示一個詢問用戶名和密碼的對話框。如果你提供一個用戶“admin”和密碼“secrer”,那么只有你可以通過 /secured/* 訪問上面的 URL,因為我們已經(jīng)定義了用戶為管理員角色,而該角色是有權(quán)訪問該資源的。

基于表單的身份驗證

當(dāng)時使用表單身份驗證方法時,你必須提供一個登錄表單來提示用戶輸入用戶名和密碼。下面是一個簡單登錄頁面 login.jsp 的代碼,用來創(chuàng)建一個相同目的的表單:

<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 命名的表單元素。在

標(biāo)簽中的動作必須是 j_security_check。POST必須以表單的方法來使用。同時你必須修改 標(biāo)簽來指定 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>

現(xiàn)在,當(dāng)你試圖用 URL /secured/* 訪問任何資源時,它將顯示以上的表單,要求用戶 id 和密碼。當(dāng)容器看到“j_security_check”動作時,它會使用一些內(nèi)部機制來對調(diào)用方進行身份驗證。

如果登錄成功,調(diào)用者會被授權(quán)訪問安全資源,那么從那時起容器會用一個 session-id 來識別調(diào)用者的登錄會話。容器會用一個包含 session-id 的 cookie 來保持這個登錄會話。服務(wù)器將 cookie 發(fā)送回客戶端,并且只要調(diào)用者使用后續(xù)的請求顯示這個 cookie 時,那么容器就會知道這個調(diào)用者是誰。

如果登錄失敗,那么服務(wù)器將發(fā)回由 form-error-page 設(shè)置識別的頁面。

這里,j_security_check 是登錄表單中使用基于表單登錄的應(yīng)用程序必須指定的一個動作。在相同的表單中,你該應(yīng)該有一個名為 j_username 的文本輸入控件和一個名為 j_password 的密碼輸入控件。當(dāng)你看到這,這意味著表單中包含的信息將會被提交到服務(wù)器,服務(wù)器將會檢查用戶名和密碼。這一步如何實現(xiàn)是由服務(wù)器指定的。

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

Servlet/JSP 中的程序性安全

HttpServletRequest 對象提供了以下方法,它可以在運行時用于挖掘安全信息:

序號 方法及描述
1

String getAuthType()

getAuthType() 方法返回一個字符串對象,代表用于保護 Servlet 的身份驗證方案的名稱。

2

boolean isUserInRole(java.lang.String role)

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

3

String getProtocol()

getProtocol() 方法返回一個字符串對象,代表用戶發(fā)送請求的協(xié)議。它的值可以用來檢查確定一個保護協(xié)議是否被使用。

4

boolean isSecure()

isSecure() 方法返回一個布爾型的值,代表請求是否是使用的 HTTPS協(xié)議。真值代表是并且連接是安全的。假值代表不是。/p>

5

Principle getUserPrinciple()

getUserPrinciple() 方法返回一個 java.security.Principle 對象,該對象包含當(dāng)前已驗證用戶的用戶名。

例如,一個 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 網(wǎng)頁來顯示只有用戶自己可以訪問的條目。如果你需要用戶名作為身份驗證表單的輸入,那么你可以在請求對象中調(diào)用 getRemoteUser 方法。