Apache Shiro許可權架構理論介紹

來源:互聯網
上載者:User

標籤:操作   cdb   特定   建議   tomcat   apc   屬性   login   部分   

Apache Shiro許可權管理架構介紹

Apache Shiro的官網地址如下:

http://shiro.apache.org/

Apache Shiro是一個簡單易用且強大而靈活的開源Java安全架構,以下簡稱Shiro。它乾淨利落地處理身份認證、授權以及企業會話管理和加密。Shiro擁有易於理解的API,你可以快速且容易地使用它來保護任何應用程式——從最小的行動裝置 App程式到最大的web和公司專屬應用程式程式。

Shiro許可權基礎概念:

  • 安全實體:就是被許可權系統保護的對象,比如工資資料。  
  • 許可權:就是需要被校正的行為,比如查看、修改等。
  • 分配許可權:把對某些安全實體的某些許可權分配給某些人員。是向資料庫裡面添加資料、或是維護資料的過程
  • 許可權驗證(許可權匹配):判斷某個人員或程式對某個安全實體是否擁有某個或某些許可權。從資料庫中擷取相應資料進行匹配的過程。
  • 許可權的繼承性:如果多個安全實體存在內含項目關聯性,而某個安全實體沒有許可權限制,則它會繼承包含它的安全實體的相應許可權。
  • 許可權的最近匹配原則:如果多個安全實體存在內含項目關聯性,而某個安全實體沒有許可權限制,那麼它會向上尋找並匹配相應許可權限制,直到找到一個離這個安全實體最近的擁有相應許可權限制的安全實體為止。如果把整個階層都尋找完了都沒有匹配到相應許可權限制的話,那就說明所有人對這個安全實體都擁有這個相應的許可權限制。

Shiro 能做什麼:

  • 認證:驗證使用者的身份
  • 授權:對使用者執行存取控制:判斷使用者是否被允許做某事
  • 管理:在任何環境下使用 Session API,即使沒有 Web 或EJB 容器。
  • 加密:以更簡潔易用的方式使用加密功能,保護或隱藏資料防止被偷窺
  • Realms:聚集一個或多個使用者安全資料的資料來源
  • 單點登入(SSO)功能:為沒有關聯到登入的使用者啟用 "Remember Me“ 服務
Shiro 的主要功能架構圖:

從中可以看到 Shiro 的四大核心部分:

  • Authentication(身分識別驗證):簡稱為“登入”,即證明使用者是誰。
  • Authorization(授權):存取控制的過程,即決定是否有許可權去訪問受保護的資源。
  • Session Management(會話管理):系統管理使用者特定的會話,即使在非 Web 或 EJB 應用程式。
  • Cryptography(加密):通過使用密碼編譯演算法保持資料安全

其中 Shiro 還提供了以下擴充:

  • Web Support:主要針對web應用提供一些常用功能。
  • Caching:緩衝可以使應用程式運行更有效率。
  • Concurrency:多線程相關功能。
  • Testing:協助我們進行測試相關功能
  • "Run As":一個允許使用者假設為另一個使用者身份(如果允許)的功能,有時候在管理指令碼很有用。
  • "Remember Me" :記住使用者身份,提供類似購物車功能。
Shiro 概念層架構的 3 個核心元件圖表:

  • Subject :正與系統進行互動的人,或某一個第三方服務。所有 Subject 執行個體都被綁定到(且這是必須的)一個SecurityManager 上。
  • SecurityManager:Shiro 架構的心臟,用來協調內部各安全性群組件,管理內部組件執行個體,並通過它來提供安全管理的各種服務。當 Shiro 與一個 Subject 進行互動時,實質上是幕後的 SecurityManager 處理所有繁重的Subject 安全操作,可以將其概念比作為是SpringMVC中的前端控制器。
  • Realms :本質上是一個特定安全的 DAO。當配置 Shiro 時,必須指定至少一個 Realm 用來進行身分識別驗證或授權。Shiro 提供了多種可用的 Realms 來擷取安全相關的資料。如關聯式資料庫(JDBC),INI 及屬性檔案等。可以定義自己 Realm 實現來代表自訂的資料來源。
Shiro 架構圖:

  • Authenticator :執行對使用者的身分識別驗證(登入)的組件。Authenticator 從一個或多個 Realm 中獲得資料以驗證使用者的身份。 若存在多個realm,則介面 AuthenticationStrategy 會確定什麼樣算是驗證成功(例如,如果一個 Realm 成功,而其他的均失敗,是否登入成功)。
  • Authorizer :許可權管理器,主要用於使用者的存取控制,驗證使用者能否訪問應用中的受保護資源。
  • SessionManager :session管理器,可在任何應用或架構層一致地使用 Session API
  • SessionDAO:SessionManager 執行 Session 持久化(CRUD)操作。
  • CacheManager :對 Shiro 組件提供緩衝支援。
  • Cryptography:Shiro 的 API 大幅度簡化 Java API 中繁瑣的密碼加密
  • Realms:Shiro 通過 Realms 來擷取相應的安全資料
Shiro 配置基礎

Shiro 被設計成能夠在任何環境下工作,從簡單的命令列應用程式到企業群集應用。由於環境的多樣性,使得 Shiro 可以使用多種配置機制。

users:

  • ini 配置:ini 實際上是一個文本配置,包含了由唯一命名的項來組織的鍵/值對。
  • [users] 部分允許定義一組靜態使用者帳戶
  • 每行的格式:username = password, roleName1, roleName2, …

roles:

  • [roles] 部分允許把定義在 [users] 部分中的角色與許可權關聯起來
  • 每行的格式:rolename = permissionDefinition1, permissionDefinition2, …
    • permissionDefinition 是一個任意的字串,但大多數人將會使用符合 org.apache.shiro.authz.permission.WildcardPermission 格式的字串。

注意:

  • 如果一個獨立的 permissionDefinition 需要被內部逗號分隔(例如,printer:5thFloor:print,info),則需要使用者雙引號環繞該定義,以避免錯誤解析。  
  • 如果角色不想關聯許可權,則不需要在 [roles] 部分把它們列出來。只需定義在 [user] 部分中定義角色名稱就足以建立尚不存在的角色。
  • 僅定義非空的 [users] 或 [roles] 部分就將自動地觸發org.apache.shiro.realm.text.IniRealm 執行個體的建立
Shiro 身份認證: Authentication

Authentication :身分識別驗證——通過提交使用者的身份和憑證給 Shiro,以判斷它們是否和應用程式預期的相匹配。

基本概念:

  • Principals(身份):Subject 的 identifying attributes(識別屬性)。比如我們登入提交的使用者名稱。
  • Credentials(憑證):用來作為一種起支援作用的證據,此證據包含×××明。比如我們登入提供的密碼

認證的基本步驟:

  • 收集Subjects 提交的Principals(身份)和Credentials(憑證);
  • 提交Principals(身份)和Credentials(憑證)進行身分識別驗證;
  • 如果提交成功,則允許訪問,否則重新進行身分識別驗證或者阻止訪問。
  • AuthenticationToken:Shiro 中代表提交的 Principals(身份) 和 Credentials (憑證) 的身分識別驗證系統的最基本介面。
  • UsernamePasswordToken :AuthenticationToken 的介面的實作類別,支援最常見的使用者名稱/密碼的身分識別驗證

提交使用者名稱/密碼進行認證:

Subject currentUser = SecurityUtils.getSubject();currentUser.login(token);

處理認證成功和失敗

  • 認證成功:沒有返回,也沒有異常,通過。
  • 認證失敗,拋出異常,可以在程式中捕獲並處理

認證順序:

認證過程:

Step 1:應用程式代碼調用 Subject.login 方法,傳遞建立好的包含終端使用者的 Principals(身份)和 Credentials(憑證)的 AuthenticationToken 執行個體

Step 2:Subject 執行個體,通常為 DelegatingSubject(或子類)委託應用程式的 SecurityManager 通過調用 securityManager.login(token) 開始真正的驗證。

Step 3:SubjectManager 接收 token,調用內部的 Authenticator 執行個體調用 authenticator.authenticate(token)。 Authenticator 通常是一個 ModularRealmAuthenticator 執行個體,支援在身分識別驗證中協調一個或多個Realm 執行個體。

Step 4:如果應用程式中配置了一個以上的 Realm,ModularRealmAuthenticator 執行個體將利用配置好的AuthenticationStrategy 來啟動 Multi-Realm 認證嘗試。在Realms 被身分識別驗證調用之前,期間和以後,AuthenticationStrategy 被調用使其能夠對每個Realm 的結果作出反應。

Step 5:每個配置的 Realm 用來協助看它是否支援提交的AuthenticationToken。如果支援,那麼支援 Realm 的 getAuthenticationInfo 方法將會伴隨著提交的 token 被調用。getAuthenticationInfo 方法有效地代表一個特定 Realm 的單一的身分識別驗證嘗試。

Shiro 授權

授權:又稱存取控制—控制誰有許可權在應用程式中做什麼。在授權中,需要瞭解幾個關鍵的對象:Subject 主體、Resource 資源、Permissions 許可權、Role 角色:

  • Subject 主體:訪問應用的使用者,在 Shiro 中使用 Subject 代表該使用者,使用者需要授權後才能訪問相應的資源
  • Resource 資源:在應用中使用者訪問的任何東西,例如:jsp、介面、圖片等,都屬於是資源
  • Permissions 許可權:Shiro 安全機制最核心的元素。它在應用程式中明確聲明了被允許的行為。一個格式良好的許可權聲明可以清晰表達出使用者對該資源擁有的許可權。在 Shiro 中主要通過萬用字元運算式來完成許可權的描述
  • Role 角色:一個命名的實體, 通常代表一組行為或職責。 這些行為演化為在一個應用中能或者不能做的事情。角色通常分配給使用者帳戶。一個角色擁有一個許可權的集合。授權驗證時,需要判斷當前角色是否擁有指定的許可權。這種角色許可權可以對該角色進行詳細的許可權描述。 Shiro官方推薦使用這種方式

授權檢查的例子:使用者是否能訪問某個網頁,編輯資料,或打使用這台印表機

授權的三要素:許可權、角色和使用者 。

需要在應用程式中對使用者和許可權建立關聯:通常的做法是將許可權分配給角色,然後將角色指派給一個或多個使用者。

Shiro的三種授權方式:

  • 編寫代碼:在 Java 代碼中用像 if 和 else 塊的結構執行授權檢查。
  • JDK 的註解:可以添加授權註解給 Java 方法
  • JSP 標籤庫:可以控制基於角色和許可權的JSP 頁面輸出。

Shiro 授權順序圖:

時序圖:

  • Step 1:應用程式或架構代碼調用任何 Subject 的hasRole*, checkRole*, isPermitted*,或者checkPermission*方法的變體,傳遞任何所需的許可權
  • Step 2:Subject 的執行個體—通常是 DelegatingSubject(或子類),調用securityManager 的對應的方法。
  • Step 3:SecurityManager 調用 org.apache.shiro.authz.Authorizer 介面的對應方法。預設情況下,authorizer 執行個體是一個 ModularRealmAuthorizer 執行個體,它支援協調任何授權操作過程中的一個或多個Realm 執行個體。
  • Step 4:每個配置好的 Realm 被檢查是否實現了相同的 Authorizer 介面。如果是,Realm 各自的 hasRole*, checkRole*, isPermitted*,或 checkPermission* 方法將被調用。
Shiro 基礎文法:Permissions的聲明方式

基礎文法之簡單的字串:

  • 即用簡單的字串來表示一個許可權,如:user (相當於:user:*

基礎文法之多層次管理:

  • 例如:user:query、user:edit
  • 多個值:每個組件能夠保護多個值。因此,除了授予使用者 user:queryuser:edit 許可權外,也可以簡單地授予他們一個:user:query, edit
  • 還可以用 * 號代替所有的值,如:user:* , 也可以寫:*:query,表示某個使用者在所有的領域都有 query 的許可權

基礎文法之執行個體級存取控制:

  • 這種情況通常會使用三個組件:域、操作、被付諸實施的執行個體。如:user:edit:manager
  • 也可以使用萬用字元來定義,如:user:edit:*、user:*:*、user:*:manager
  • 部分省略萬用字元:缺少的組件意味著使用者可以訪問所有與之匹配的值,比如:user:edit 等價於 user:edit :*、user 等價於 user:*:*

注意:萬用字元只能從字串的結尾處省略組件,也就是說 user:edit 並不等價於 user:*:edit

Shiro 登出

logout(登出):currentUser.logout();

  • 調用 logout() 方法時,現有 Session 將失效,而且身份將失去關聯(在Web 應用程式中,RememberMe cookie 將被刪除)。
  • 在 Subject 登出後,該 Subject 的執行個體被再次認為是匿名的。

注意:WEB 應用程式記住身份往往依靠 Cookie,然而Cookie 只能在 Response 被返回後被刪除,所以建議在調用subject.logout() 後立即向終端重新導向一個新的視圖或頁面。這樣即能保證與安全相關的 Cookie 都能像預期的一樣被刪除。

Realm
  • Realm:訪問應用程式安全資料(如使用者、角色及許可權)的組件。
  • Realm 通常和資料來源是一對一的對應關係,如關聯式資料庫、檔案系統或其他類似資源。Realm 實質上就是一個訪問安全資料的 DAO。
  • 資料來源通常儲存驗證資料(如密碼的憑證)以及授權資料(如角色或許可權),所以每個Realm 都能夠執行身分識別驗證和授權操作。
Realms的認證實現

Shiro 的認證過程由 Realm 執行,SecurityManager 會調用 org.apache.shiro.realm.RealmgetAuthenticationInfo(AuthenticationToken token) 方法

實際開發中,通常會提供 org.apache.shiro.realm.AuthenticatingRealm 的實作類別,並在該實作類別中提供doGetAuthenticationInfo(AuthenticationToken token)方法的具體實現

  1. 檢查提交的進行認證的令×××資訊
  2. 根據令×××資訊從資料來源(通常為資料庫)中擷取使用者資訊
  3. 對使用者資訊進行匹配驗證。
  4. 驗證通過將返回一個封裝了使用者資訊的 AuthenticationInfo 執行個體。
  5. 驗證失敗則拋出 AuthenticationException 異常資訊。
Shiro許可權攔截

Shiro和Spring Security一樣,都是基於過濾器來實現許可權攔截的。shiro中預設的過濾器:

過濾器鏈:

過濾器類圖:

Shiro會話管理

Shiro提供了完整的企業級會話管理功能,不依賴於底層容器(如Tomcat),不管是J2SE還是J2EE環境都可以使用,提供了會話管理,會話事件監聽,會話儲存/持久化,容器無關的叢集,失效/到期支援,對Web的透明支援,SSO單點登入的支援等特性。

建議在開發中,Controller層使用原生的HttpSession對象,在Service層中使用Shiro提供的Session對象。如果在Service層中使用HttpSession對象,那麼屬於侵入式,並不建議這麼做。Shiro提供的Session能夠很好的解決這個問題。

會話管理相關類圖:

Shiro許可權緩衝

緩衝是×××能的重要手段,對同一批資料進行多次查詢時, 第一次查詢走資料庫,查詢資料後,將資料儲存在記憶體中,第二次以後查詢可以直接從記憶體擷取資料,從而不需要和資料庫進行互動。這樣減少了系統查詢資料庫的次數,提升了效能。

緩衝適合那些經常不變動的資料,比如系統中使用者的資訊和許可權不會經常改變,特別適合緩衝起來供下次使用。其中我們的許可權資訊就是不怎麼會改變的,對許可權資訊進行緩衝可以提高我們系統的效能。不過 Shiro 自身不實現緩衝,而是提供緩衝介面,讓其他第三方實現,預設支援EhCache和MapCache緩衝。

Shiro 緩衝相關的類圖:

Apache Shiro許可權架構理論介紹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.