- JSP 基礎教程
- JSP - 首頁
- JSP - 概述
- JSP - 環境搭建
- JSP - 架構
- JSP - 生命週期
- JSP - 語法
- JSP - 指令
- JSP - 動作
- JSP - 隱式物件
- JSP - 客戶端請求
- JSP - 伺服器響應
- JSP - HTTP 狀態碼
- JSP - 表單處理
- JSP - 編寫過濾器
- JSP - Cookie 處理
- JSP - 會話跟蹤
- JSP - 檔案上傳
- JSP - 日期處理
- JSP - 頁面重定向
- JSP - 訪問計數器
- JSP - 自動重新整理
- JSP - 傳送郵件
- JSP 高階教程
- JSP - 標準標籤庫
- JSP - 資料庫訪問
- JSP - XML 資料
- JSP - JavaBean
- JSP - 自定義標籤
- JSP - 表示式語言
- JSP - 異常處理
- JSP - 除錯
- JSP - 安全性
- JSP - 國際化
- JSP 有用資源
- JSP - 問答
- JSP - 快速指南
- JSP - 有用資源
- JSP - 討論
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_username和j_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方法。