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

Apache Shiro 入門實戰:核心概念、權限模型與官方 Quickstart 完整解析

     編輯:Java 綜合教學

Apache Shiro 入門實戰:核心概念、權限模型與官方 Quickstart 完整解析

Apache Shiro 是強大且易用的 Java 安全框架,提供認證、授權、加密、會話管理等功能。本文從核心概念切入,解析權限模型,並完整走讀官方 Quickstart 範例,建立 Shiro 實戰基礎。

一、權限基礎概念

概念說明
安全實體受保護的資料/資源
權限對資源的操作能力(查看、修改、刪除)

權限兩大特性

  1. 繼承性:A 包含 B,A 有權限 → B 繼承權限(如:大廈門禁權限涵蓋公共廁所)
  2. 最近路徑匹配:具體層級權限優先(如:該樓層電梯權限優於大廈門禁)

五大核心關鍵字

  • 認證:驗證身份(帳號密碼、鎖定狀態)
  • 授權:決定是否可存取資源
  • 加密:保護/隱藏資源
  • 會話管理:跨環境會話支援
  • 單點登入 (SSO):一次登入,多系統存取

二、Shiro 核心架構三大組件

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

五、權限字串設計規範

組件角色職責
Subject當前用戶安全操作入口,代表當前執行主體
SecurityManager大管家核心管理器,統籌認證、授權、會話、快取、Realm
Realm資料源連接資料庫/LDAP 等,提供認證授權資料

等價規則:user:edit == user:edit:*、user == user:*:*(僅尾部可省略)。

六、總結

Shiro 以「Subject 為中心、SecurityManager 為核心、Realm 為資料源」的簡潔架構,解決了 Java 安全領域的大多數需求。掌握:

  1. 認證 vs 授權的分工
  2. 用戶-角色-權限關係建模
  3. 權限字串設計規範
  4. INI 配置與程式碼 API 對應

後續可深入:自定義 Realm 連接資料庫、整合 Spring、快取優化、JWT 無狀態認證等進階主題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型格式範例說明
簡單字串資源user粗粒度
多層次資源:操作user:create, user:*通配符支援
實例級資源:操作:實例IDorder:delete:12345精細控制