繼認證(登錄驗證)後,本文深入 Shiro 授權核心——基於資源的權限控制。相較角色授權,資源級授權更適應複雜業務系統的靈活性需求。
# 用戶定義:用戶名=密碼,角色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"); // 不通過拋異常
}
| 授權類型 | 判斷方法(返回 boolean) | 強制檢查方法(拋異常) |
|---|---|---|
| 角色授權 | hasRole / hasAllRoles | checkRole / checkRoles |
| 資源授權 | isPermitted / isPermittedAll | checkPermission / checkPermissions |
當前為靜態 INI 配置,生產環境需結合 Spring + MyBatis 實現:
Realm 從數據庫動態加載用戶/角色/權限@RequiresPermissions)控制器層攔截後續文章將詳細講解動態授權架構落地。