什麼是 Apache Shiro

 

什麼是Apache Shiro


        Apache Shiro 是一種功能強大且易於使用的Java安全框架,它具有身份驗證、訪問授權、數據加密、會話管理等功能,可用於保護任何應用程序的安全。
如: 命令行應用程序、移動應用程序、Web應用程序、企業級應用程序。從小到大到很大,Apache Shiro都會給你提供安全幫助。

 

Shiro 爲你的應用程序提供如下API,幫助你更好的管理應用程序的安全。

 

  •   身份驗證

    證明用戶的身份。也就是所謂的用戶的 “登錄” 功能,驗證訪問的用戶是否有權利登錄系統或者訪問後臺接口。

  •   授權

    訪問權限的控制。 根據登錄用戶被分配的權限,控制用戶可以訪問哪些接口、那個模塊菜單、那個頁面、那個按鈕等。

  •   密碼學

    保護或隱藏數據以防止被窺視。 比如對用戶密碼進行加密、對訪問的數據進行加密返回等,保證用戶信息及數據的安全性。

  •  會話管理

    每個用戶的時間敏感狀態。比如用戶是否登錄、會話是否超時等。

  •  輔助功能

    Web應用程序的安全性、單元測試、多線程支持等。輔助功能是爲了加強上面四點功能的能力。


 爲什麼要用Apache Shiro


      如今使用Apache Shiro的人越來越多,因爲Shiro相對於Spring Security 來說更容易上手寫。Apache Shiro 功能簡單,易於使用。只要簡單的配置就可以實現日常的安全性功能,簡單的API讓新人更容易使用,讓你有更多的時間放在業務需求的實現上。


Apache Shiro 三大組件

 

  •   主體(Subject)
  •   安全管理器(SecurityManager)
  •   領域(Realm)

 

主體

        代表當前“用戶”,“用戶”一次不一定指的是人,也可以是其他應用程序、接口等。這是一個抽象概念,用於表示與該程序交互的任何事物。應用代碼直接交互的對象就是Subject,Shiro對外API的核心對象就是主體(Subject)。


安全管理器

      安全管理器是Shiro的核心組件。即所有與安全有關的操作都會與安全管理器(SecurityManager)交互,如,主體(Subject)的管理者就是安全控制器(SecurityManager)。安全管理器還管理者Shiro 中的其它組件,來協調它們共同更好的完成安全管理。

領域

       領域充當Shiro與應用程序的安全數據之間的“橋樑”或“連接器”。當需要與安全性相關的數據進行交互,來實現身份驗證或者授權時,Shiro會從爲應用程序配置的一個或者多個領域中查找到許多需要的內容。它封裝了數據源鏈接的詳細信息,並根據需要使關聯的數據可以被Shiro使用。在配置Shiro時,至少要指定一個領域用於身份驗證或授權。如果Shiro中默認給配置的領域無法滿足你的需求,你可以插入自己的領域實現,用於表示自定義數據源。

       Shiro從領域(Realm)獲取安全數據(如,用戶、角色、權限),當安全管理器(SecurityManager)要驗證用戶身份,那麼它需要從領域中獲取相應的用戶信息進行比較以確定用戶身份是否合法,也需要從Realm得到用戶相應的角色/權限進行驗證用戶是否能進行某項操作。可以理解Realm爲DAO層,與數據源交互,來獲取安全數據,安全數據源。


工作流程

從應用程序角度的來觀察如何使用 Shiro 完成工作。如下圖:

與應用程序交互時序圖

 

上圖解釋(由上到下):

  1.  應用代碼帶着前端傳入的用戶名密碼信息調用主體的認證授權接口。
  2.  主體將帶着傳入的用戶名密碼信息告訴安全管理器,這個用戶需要認證授權。
  3.  應用程序在調用完認證授權接口後,會通過用戶名,到後臺數據庫中查詢相應的用戶信息。注意:此接口需要我們自己寫。 
  4.  如果用戶存在,將用戶的基本信息(用戶名、加密後的密碼、角色、權限)返回給應用程序。注意:此處的用戶信息,需要我們自己封裝。
  5.  應用程序將返回的用戶信息(用戶名、加密後的密碼、角色、權限等信息)封裝到領域對象中。
  6.  將帶有用戶信息的領域注入到安全管理器中,安全管理器會將從前端傳入的用戶名密碼與領域中的用戶名密碼進行對比,如果一一致,則認爲該用戶信息合法。該用戶可以使用相應角色權限對應的接口或功能等。

注意:

       這裏的用戶密碼是通過加密的,數據庫返回的密碼一定是在用戶在第一次註冊,或者後續需改後進行加鹽加密的,前端通過應用程序傳入到安全控制器中的密碼最初是明文,或者是通過密鑰加密過的,安全管理器會對傳入的密碼按照規定好的加鹽加密算法進行加密,得到一串亂亂的字符串,與數據庫查出來的加密後的密碼串進行對比,如果一致,則認爲用戶信息合法。

從上圖可以看出,Shiro 不提供維護用戶 / 權限,需要通過 Realm 讓開發人員自己注入。

 


Apache Shiro 基本功能

  • Authentication:身份認證 / 登錄,驗證用戶是否擁有相應的身份。
  • Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限。
  • Session Manager:會話管理,即用戶登錄後就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通 JavaSE 環境的,也可以是如 Web 環境的。
  • Cryptography:加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲。
  • Web Support:Web 支持,可以非常容易的集成到 Web 環境。
  • Caching:緩存,比如用戶登錄後,其用戶信息、擁有的角色 / 權限不必每次去查,這樣可以提高效率。
  • Concurrency:shiro 支持多線程應用的併發驗證,即如在一個線程中開啓另一個線程,能把權限自動傳播過去。
  • Testing:提供測試支持。
  • Run As:允許一個用戶假裝爲另一個用戶(如果他們允許)的身份進行訪問。
  • Remember Me:記住我,即一次登錄後,下次再來的話不用登錄了。

Apache Shiro 內部架構圖

內部架構圖

 

  • Subject:主體,可以看到主體可以是任何可以與應用交互的 “用戶”。
  • SecurityManager:是 Shiro 的心臟,所有具體的交互都通過 SecurityManager 進行控制,它管理着所有 Subject、且負責進行認證和授權、及會話、緩存的管理。
  • Authenticator:認證器,負責主體認證的,這是一個擴展點,如果用戶覺得 Shiro 默認的不好,可以自定義實現。其需要認證策略(Authentication Strategy),即什麼情況下算用戶認證通過了。
  • Authrizer:授權器,或者訪問控制器,用來決定主體是否有權限進行相應的操作;即控制着用戶能訪問應用中的哪些功能。
  • Realm:可以有 1 個或多個 Realm,可以認爲是安全實體數據源,即用於獲取安全實體的;可以是 JDBC 實現,也可以是 LDAP 實現,或者內存實現等等;由用戶提供。注意:Shiro 不知道你的用戶 / 權限存儲在哪及以何種格式存儲。所以我們一般在應用中都需要實現自己的 Realm;
  • SessionManager:Session管理器,如,用戶一次訪問在沒有關閉頁面之前,算是一個Session。Session 需要有人去管理它的生命週期,這個組件就是 SessionManager。而 Shiro 並不僅僅可以用在 Web 環境,也可以用在如普通的 JavaSE 環境、EJB 等環境。所有呢,Shiro 就抽象了一個自己的 Session 來管理主體與應用之間交互的數據;這樣的話,比如我們在 Web 環境用,剛開始是一臺 Web 服務器;接着又上了臺 EJB 服務器;這時想把兩臺服務器的會話數據放到一個地方,這個時候就可以實現自己的分佈式會話(如把數據放到 Redis 服務器);
  • SessionDAO:DAO 大家都用過,數據訪問對象,用於會話的 CRUD,比如我們想把 Session 保存到數據庫,那麼可以實現自己的 SessionDAO,通過如 JDBC 寫到數據庫;比如想把 Session 放到 Redis中,可以實現自己的 Redis SessionDAO;另外 SessionDAO 中可以使用 Cache 進行緩存,以提高性能。
  • CacheManager:緩存控制器,來管理如用戶、角色、權限等的緩存的;因爲這些數據基本上很少去改變,放到緩存中後可以提高訪問的性能。
  • Cryptography:密碼模塊,Shiro 提高了一些常見的加密組件用於如密碼加密 / 解密的。

以上是Apache Shiro 基本概念的學習內容,記錄於此,如有不對之處,還請各位大神指點。

 


本文參考

http://shiro.apache.org/reference.html

https://www.iteye.com/blog/jinnianshilongnian-2018936

感謝各位大神們分享的博客記錄。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章