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

Shiro 權限框架實戰:基於資源的細粒度授權模型與 Spring 整合預覽

     編輯:Java 綜合教學

Shiro 權限框架實戰:基於資源的細粒度授權模型與 Spring 整合預覽

繼認證(登錄驗證)後,本文深入 Shiro 授權核心——基於資源的權限控制。相較角色授權,資源級授權更適應複雜業務系統的靈活性需求。

INI 配置:用戶-角色-權限三層映射

# 用戶定義:用戶名=密碼,角色1,角色2
[users]
eric=123456,boss,hr
merry=123456,hr

# 角色-權限映射:角色=資源:操作
[roles]
boss=user:create,user:update
hr=user:create,user:delete
tl=user:create

授權代碼實戰

@Test
public void testAuthorization() {
    // 1. 構建 SecurityManager
    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/shiro-permission.ini");
    SecurityManager securityManager = factory.getInstance();
    SecurityUtils.setSecurityManager(securityManager);

    // 2. 登錄認證
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken("eric", "123456");
    try {
        subject.login(token);
    } catch (AuthenticationException e) {
        e.printStackTrace();
    }
    System.out.println("認證狀態:" + subject.isAuthenticated());

    // 3. 基於角色授權
    boolean hasHrRole = subject.hasRole("hr");                    // 單角色判斷
    boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("boss", "hr", "tl")); // 多角色判斷
    // subject.checkRole("employee"); // 不通過拋異常

    // 4. 基於資源授權(推薦)
    boolean permitted = subject.isPermitted("user:create:1");           // 單權限
    boolean permittedAll = subject.isPermittedAll("user:create:1", "user:delete"); // 多權限
    // subject.checkPermission("items:create:1"); // 不通過拋異常
}

核心 API 對比

授權類型判斷方法(返回 boolean)強制檢查方法(拋異常)
角色授權hasRole / hasAllRolescheckRole / checkRoles
資源授權isPermitted / isPermittedAllcheckPermission / checkPermissions

下一步:動態權限與 Spring 整合

當前為靜態 INI 配置,生產環境需結合 Spring + MyBatis 實現:

  1. 自定義 Realm 從數據庫動態加載用戶/角色/權限
  2. 緩存機制優化授權查詢性能
  3. 註解式授權(@RequiresPermissions)控制器層攔截
  4. URL 級攔截器配置

後續文章將詳細講解動態授權架構落地。

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