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

Struts 權限控制實作:基於角色與模組的存取管理策略

     編輯:Java 相關知識

在 Web 系統開發中,使用者權限控管向來是核心議題。本文分享一套在 Struts 框架下實作細粒度權限控制的實務做法,供各位參考討論。

核心資料模型設計

系統採用經典的 RBAC(Role-Based Access Control)模型:

  • 使用者與角色:一對多關係,每位使用者隸屬單一角色,避免權限歸屬混淆。
  • 預設角色機制:系統初始內建「超級管理員」(如 root)、「訪客」與「註冊用戶」三大角色,其中預設角色不可刪除。
  • 角色刪除策略:若角色下仍有使用者,可選擇禁止刪除,或自動將該角色使用者歸屬為「註冊用戶」。

權限映射架構

採用三層映射關係實現靈活授權:

  1. 角色 ↔ 功能模組:多對多關係,由超級管理員動態配置各角色可存取的模組。
  2. 功能模組 ↔ Action:一個模組包含多個 Action,屬多對一關係。
  3. 使用者 → 角色 → 模組 → Action:請求進入時,系統依此鏈路驗證權限。

Struts 具體實作步驟

1. 模組資料持久化

系統開發完成後,所有功能模組資訊寫入持久化儲存(資料庫或配置檔),作為權限判斷基準。

2. struts-config.xml 擴展配置

在每個 <action> 節點新增 role 屬性,填入對應模組名稱,建立 Action 與模組的映射關係:

<action path="/user/list" type="com.example.UserListAction" role="user_management" />

3. 資料庫關聯表設計

建立 user、role、module 三張核心表及其關聯表,實現角色與模組的多對多映射。

4. 擴展 RequestProcessor 攔截驗證

繼承 Struts 的 RequestProcessor(若使用 Tiles 需繼承 TilesRequestProcessor),覆寫 processRoles() 方法:

protected boolean processRoles(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) {
    // 1. 取得當前 Action 對應的模組名稱
    String moduleName = mapping.getRole();
    
    // 2. 從 Session 取得當前使用者角色
    User user = (User) request.getSession().getAttribute("currentUser");
    Role role = user.getRole();
    
    // 3. 查詢角色是否擁有該模組權限(建議加入快取機制)
    boolean hasPermission = permissionCache.hasPermission(role.getId(), moduleName);
    
    if (!hasPermission) {
        // 轉向無權限頁面或拋出異常
        return false;
    }
    return true;
}

進階防護機制

除基本角色驗證外,可在同一方法中整合:

  • IP 綁定:記錄登入 IP,偵測到 IP 變更即銷毀 Session,防止 Session ID 被盜用。
  • 單一 Session 強制:同一帳號同時間僅允許一個有效 Session。
  • 快取優化:權限查詢採用多級快取(如 Ehcache + 本地記憶體),降低資料庫壓力。

優缺點分析

優點缺點
URL 級攔截,即使連結外洩也能阻擋非法存取 每次請求皆需判斷,需搭配快取機制緩解效能
配置集中於 struts-config.xml,維護直觀 Action 數量龐大時,role 屬性維護成本增加
擴充性強,易整合 IP、Session 等進階策略 僅適用於 Struts 1.x 架構,Struts 2 需改用 Interceptor 實現

此方案在中型專案中驗證可行,若專案採用 Spring Security 或 Shiro 等專業安全框架,建議改用標準化方案替代。

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