Apache Shiro 是強大且易用的 Java 安全框架,提供認證、授權、加密、會話管理等功能。本文從核心概念切入,解析權限模型,並完整走讀官方 Quickstart 範例,建立 Shiro 實戰基礎。
| 組件 | 角色 | 職責 |
| Subject | 當前用戶 | 安全操作入口,代表當前執行主體 |
| SecurityManager | 大管家 | 核心管理器,統籌認證、授權、會話、快取、Realm |
| Realm | 資料源 | 連接資料庫/LDAP 等,提供認證授權資料 |
SecurityManager 貫穿始終的核心能力:**加密**。
三、用戶-角色-權限模型
概念定義
- 用戶:登入主體(帳號/密碼)
- 角色:權限集合(如:admin、user)
- 權限:具體操作授權(如:user:create、order:delete)
關係映射
- 用戶 ↔ 角色:多對多(用戶角色中間表)
- 角色 ↔ 權限:多對多(角色權限中間表)
所有關係由 SecurityManager 統一管理。
四、官方 Quickstart 完整走讀
依賴 JAR(核心)
- shiro-core
- slf4j-api + 實作
- commons-beanutils, commons-logging 等
核心程式碼流程
// 1. 從 INI 建立 SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
// 2. 獲取當前 Subject
Subject currentUser = SecurityUtils.getSubject();
// 3. Session 管理(無需 Web 容器)
Session session = currentUser.getSession();
session.setAttribute("someKey", "aValue");
// 4. 認證登入
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
token.setRememberMe(true);
try {
currentUser.login(token);
} catch (UnknownAccountException e) { /* 帳號不存在 */ }
catch (IncorrectCredentialsException e) { /* 密碼錯誤 */ }
catch (LockedAccountException e) { /* 帳號鎖定 */ }
catch (AuthenticationException e) { /* 其他認證失敗 */ }
}
// 5. 角色檢查
if (currentUser.hasRole("schwartz")) { /* 有角色 */ }
// 6. 權限檢查(字串/實例級)
if (currentUser.isPermitted("lightsaber:weild")) { /* 有權限 */ }
if (currentUser.isPermitted("winnebago:drive:eagle5")) { /* 實例級權限 */ }
// 7. 登出
currentUser.logout();
shiro.ini 配置解析
[users]
# 格式:用戶名 = 密碼, 角色1, 角色2
root = secret, admin
guest = guest, guest
lonestarr = vespa, goodguy, schwartz
[roles]
# 格式:角色 = 權限1, 權限2
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5
五、權限字串設計規範
| 類型 | 格式 | 範例 | 說明 |
| 簡單字串 | 資源 | user | 粗粒度 |
| 多層次 | 資源:操作 | user:create, user:* | 通配符支援 |
| 實例級 | 資源:操作:實例ID | order:delete:12345 | 精細控制 |
等價規則:user:edit == user:edit:*、user == user:*:*(僅尾部可省略)。
六、總結
Shiro 以「Subject 為中心、SecurityManager 為核心、Realm 為資料源」的簡潔架構,解決了 Java 安全領域的大多數需求。掌握:
- 認證 vs 授權的分工
- 用戶-角色-權限關係建模
- 權限字串設計規範
- INI 配置與程式碼 API 對應
後續可深入:自定義 Realm 連接資料庫、整合 Spring、快取優化、JWT 無狀態認證等進階主題。
- 上一篇文章: JavaWeb 學習筆記:MVC 設計模式與三層架構實戰心得
- 下一篇文章: Java 代理模式完整實戰:靜態代理、動態代理與 CGLIB 代理深度對比
Copyright ©
程式碼之家 All Rights Reserved