首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2EE Web 應用安全機制深度解析:表單認證與資料庫整合實戰

     編輯:Java 相關知識

Web 應用安全包含認證 (確認身分) 與授權 (控制存取) 兩大面向。J2EE Web 容器內建三種認證機制:基本認證、表單認證、雙向認證。表單認證因支援自訂登入介面,成為企業級應用主流選擇。本文深入解析表單認證如何與資料庫/LDAP 整合、部署描述符角色配置、以及應用層功能級授權擴展。

表單認證配置詳解

web.xml 登入設定

<login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
    <form-login-page>/login.jsp</form-login-page>
    <form-error-page>/fail_login.html</form-error-page>
  </form-login-config>
</login-config>

登入表單規範 (login.jsp)

<form method="POST" action="j_security_check">
  <input type="text" name="j_username">
  <input type="password" name="j_password">
</form>
  • 表單 必須 送至 j_security_check
  • 帳號欄位 必須 命名為 j_username
  • 密碼欄位 必須 命名為 j_password
  • 非 HTTPS 環境下帳密明文傳輸,生產環境強制啟用 SSL

容器認證授權流程

  1. 存取受保護資源 → 判斷用戶是否已認證
  2. 未認證 → 重導向至 form-login-page
  3. 用戶提交憑證 → 容器依配置的 安全境域 驗證
  4. 驗證通過 → 取得用戶安全角色 → 對照 web.xml <auth-constraint> 授權
  5. 授權失敗 → 回傳 403/錯誤頁

關鍵難點:表單認證與資料庫/LDAP 整合

誤區:web.xml 的 <login-config> 不指定安全境域類型,容器如何知道用資料庫還是 LDAP 驗證?

解決:安全境域在 容器層級** 配置 (非應用層級)。以 Tomcat 為例,在 server.xml 定義 <Realm>:

<Realm
  className="org.apache.catalina.realm.JDBCRealm"
  driverName="oracle.jdbc.driver.OracleDriver"
  connectionURL="jdbc:oracle:thin:@{IP}:{Port}:{SID}"
  connectionName="{DB_User}"
  connectionPassword="{Password}"
  userTable="users" userNameCol="username" userCredCol="password"
  userRoleTable="user_roles" roleNameCol="rolename"
/>

容器啟動時載入此 Realm,所有部署應用的表單認證自動使用此資料庫驗證。WebLogic、WebSphere 同理在容器配置定義 Realm。

資料庫 Schema 設計

CREATE TABLE users (username VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL);
CREATE TABLE roles (rolename VARCHAR(20) NOT NULL);
CREATE TABLE user_roles (username VARCHAR(20) NOT NULL, rolename VARCHAR(20) NOT NULL);

INSERT INTO users VALUES ('user1', 'password');
INSERT INTO roles VALUES ('manager');
INSERT INTO user_roles VALUES ('user1', 'manager');

Web.xml 安全限制配置

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Protected Area</web-resource-name>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>manager</role-name>  <!-- 必須與 user_roles.rolename 一致 -->
  </auth-constraint>
  <user-data-constraint>
    <transport-guarantee>NONE</transport-guarantee> <!-- 生產改為 CONFIDENTIAL 強制 SSL -->
  </user-data-constraint>
</security-constraint>

授權層次與應用層擴展

容器層:URL 級授權

容器依 <security-constraint> 保護 URL 模式,粒度以「Web 資源」為單位。

應用層:功能級授權

業務常需在同一頁面控制按鈕/功能可見性。容器標準未解決權限模型,解決方案:

  1. 定義高層角色:在 web.xml 定義單一高層角色 (如 app_user),所有合法用戶皆授予此角色,確保通過容器 URL 授權。
  2. 應用內擴展細粒度角色:定義 sysadmin、appadmin 等應用專屬角色,**不需在 web.xml 宣告**。
  3. 權限模型:應用建立角色-權限對應,透過 request.isUserInRole("sysadmin") 判斷功能存取。雖未在部署描述符定義,isUserInRole 仍可運作 (需容器支援)。

Tomcat 完整部署步驟

  1. 建立上述三張資料表並插入測試資料
  2. 將 Oracle JDBC 驅動 (ojdbc*.jar) 放入 {tomcat_home}/server/lib
  3. 修改 {tomcat}/conf/server.xml 加入 JDBCRealm 設定 (替換 IP/Port/SID/User/Pass)
  4. 配置應用 web.xml 安全限制與登入設定
  5. 啟動 Tomcat,訪問 https://{ip:port}/security-form-based/protected/index.jsp 測試

WebLogic 差異

WebLogic web.xml 額外需宣告 <security-role> 區段:

<security-role>
  <role-name>manager</role-name>
</security-role>

其餘配置與 Tomcat 大同小異。

容器管理安全優勢

  • 應用無需實現認證邏輯,簡化配置
  • 提供 getRemoteUser()、isUserInRole()、getUserPrincipal() API 實現程式化安全
  • 認證資訊可傳播至 EJB 容器,實現端到端安全

表單認證結合容器級 Realm 配置,讓應用專注業務邏輯,同時靈活整合既有資料庫/LDAP 身分體系,是 J2EE Web 安全的標準實踐路徑。

登入頁面

錯誤頁面

專案結構

授權流程

角色模型

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved