位置:首頁 > Java技術 > JSP教學 > JSP安全

JSP安全

JavaServer頁麵和servlet提供給Web開發人員幾個機製,以確保應用程序。資源是通過確定它們在應用程序部署描述符和分配角色給他們聲明的保護。

認證的幾個層次可用,使用證書,從基本的使用認證標識和密碼,複雜的認證。

基於角色的身份驗證:

在Servlet規範的認證機製使用一種稱為基於角色的安全技術。這個想法是,而不是在用戶級彆限製的資源,您創建角色和角色限製的資源。

可以在文件tomcat-users.xml中,位於關在機密Tomcat的主目錄定義不同的角色。本文件的一個例子如下所示:

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

文件定義的用戶名,密碼和角色之間的簡單映射。請注意,給定的用戶可以具有多個角色,例如,name="both"是在“Tomcat的”角色和“role1”的作用。

一旦你識彆和定義不同的角色,基於角色的安全限製可以通過使用在WEB-INF目錄中可用的web.xml文件中的<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>

上述項目將意味著:

  • 任何HTTP GET或POST請求來匹配 /secured/* 將受到安全限製的URL。

  • 個人與管理者的角色被賦予訪問受保護的資源。

  • 最後,在login-config元素用來描述認證的基本形式。

現在,如果您嘗試瀏覽到包含/security目錄的任何URL,它會顯示一個對話框,要求用戶名和密碼。如果你提供用戶“admin”和密碼“secrer”,那麼隻有將會對URL訪問匹配/secured/*因為上麵我們已經定義了用戶名為admin,誰被允許訪問此資源管理器的作用。 

基於表單認證:

當使用表單身份驗證方法,必須提供一個登錄表單提示輸入用戶名和密碼的用戶。以下是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>標記來指定身份驗證,方法形式:

<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/*,它會顯示上麵的表單要求用戶名和密碼。當容器看見“j_security_check”的動作,它使用了一些內部機製來驗證調用者。 

如果登錄成功並且調用方被授權訪問受保護的資源,則容器使用一個會話ID來標識一個登錄會話的調用者從這一點上。容器維護與包含會話ID的Cookie的登錄會話。服務器發送的cookie返回給客戶端,隻要調用者提出這個cookie與後續請求,那麼容器就知道調用方是誰。

如果登錄失敗,則服務器將返回確定的表單錯誤頁麵設置頁麵

這裡的j_security_check是使用基於表單登錄的應用程序必須指定登錄表單的動作。在同一個表格,你也應該有一個文本輸入控件調用j_username和密碼輸入控件調用為j_password。當你看到這則意味著包含在表單中的信息將被提交到服務器,將檢查名稱和密碼。如何做到這一點的是服務器的特定。

檢查標準領域實現了解如何運作j_security_check 在Tomcat容器。

在Servlet/ JSP程序安全性:

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

SN 方法和描述
1 String getAuthType()
The getAuthType() method returns a String object that represents the name of the authentication scheme used to protect the Servlet.
2 boolean isUserInRole(java.lang.String role)
The isUserInRole() method returns a boolean value: true if the user is in the given role or false if they are not.
3 String getProtocol()
The getProtocol() method returns a String object representing the protocol that was used to send the request. This value can be checked to determine if a secure protocol was used.
4 boolean isSecure()
The isSecure() method returns a boolean value representing if the request was made using HTTPS. A value of true means it was and the connection is secure. A value of false means the request was not.
5 Principle getUserPrinciple()
The getUserPrinciple() method returns a java.security.Principle object that contains the name of the current authenticated user.

例如,一個JavaServer頁麵經理鏈接到的網頁,可能有下麵的代碼:

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

通過檢查在JSP或Servlet中的用戶角色,可以自定義網頁顯示用戶隻有她可以訪問項目。如果需要用戶的名稱,因為它是輸入到驗證表單,您可以在請求對象調用getRemoteUser方法。