Web 應用安全包含認證 (確認身分) 與授權 (控制存取) 兩大面向。J2EE Web 容器內建三種認證機制:基本認證、表單認證、雙向認證。表單認證因支援自訂登入介面,成為企業級應用主流選擇。本文深入解析表單認證如何與資料庫/LDAP 整合、部署描述符角色配置、以及應用層功能級授權擴展。
<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>
<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
</form>
j_security_checkj_usernamej_passwordform-login-pageweb.xml <auth-constraint> 授權誤區: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。
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');
<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>
容器依 <security-constraint> 保護 URL 模式,粒度以「Web 資源」為單位。
業務常需在同一頁面控制按鈕/功能可見性。容器標準未解決權限模型,解決方案:
web.xml 定義單一高層角色 (如 app_user),所有合法用戶皆授予此角色,確保通過容器 URL 授權。sysadmin、appadmin 等應用專屬角色,**不需在 web.xml 宣告**。request.isUserInRole("sysadmin") 判斷功能存取。雖未在部署描述符定義,isUserInRole 仍可運作 (需容器支援)。{tomcat_home}/server/lib{tomcat}/conf/server.xml 加入 JDBCRealm 設定 (替換 IP/Port/SID/User/Pass)web.xml 安全限制與登入設定https://{ip:port}/security-form-based/protected/index.jsp 測試WebLogic web.xml 額外需宣告 <security-role> 區段:
<security-role>
<role-name>manager</role-name>
</security-role>
其餘配置與 Tomcat 大同小異。
getRemoteUser()、isUserInRole()、getUserPrincipal() API 實現程式化安全表單認證結合容器級 Realm 配置,讓應用專注業務邏輯,同時靈活整合既有資料庫/LDAP 身分體系,是 J2EE Web 安全的標準實踐路徑。




