入門概述
1 shiro是什么?
Apache Shiro 是一個功能強大且易于使用的 Java 安全(權限)框架。Shiro 可以完成:認證、授權、加密、會話管理、與 Web 集成、緩存 等。借助 Shiro 您可以快速輕松地保護任何應用程序——從最小的移動應用程序到最大的 Web 和企業應用程序。
簡單來說,shiro是一個java的安全(權限)框架。
2 為什么要用shiro?
① 易于使用:使用 Shiro 構建系統安全框架非常簡單。就算第一次接觸也可以快速掌握。
② 全面:Shiro 包含系統安全框架需要的功能,滿足安全需求的“一站式服務”。
③ 靈活:Shiro 可以在任何應用程序環境中工作。雖然它可以在 Web、EJB 和 IoC 環境中工作,但不需要依賴它們。Shiro 也沒有強制要求任何規范,甚至沒有很多依賴項。
④ 強力支持 Web:Shiro 具有出色的 Web 應用程序支持,可以基于應用程序 URL 和 Web 協議(例如 REST)創建靈活的安全策略,同時還提供一組 JSP 庫來控制頁面輸出。
⑤ 兼容性強:Shiro 的設計模式使其易于與其他框架和應用程序集成。Shiro 與 Spring、Grails、Wicket、Tapestry、Mule、Apache Camel、Vaadin 等框架無縫集成。
⑥ 社區支持:Shiro 是 Apache 軟件基金會的一個開源項目,有完備的社區支持,文檔支持。如果需要,像 Katasoft 這樣的商業公司也會提供專業的支持和服務
3 Shiro和SpringSecurity的區別?
① Spring Security 基于 Spring 開發,項目若使用 Spring 作為基礎,配合 Spring Security 做權限更加方便,而 Shiro 需要和 Spring 進行整合開發;
② Spring Security 功能比 Shiro 更加豐富些,例如安全維護方面;
③ Spring Security 社區資源相對比 Shiro 更加豐富;
④ Shiro 的配置和使用比較簡單,Spring Security 上手復雜些;
⑤ Shiro 依賴性低,不需要任何框架和容器,可以獨立運行.Spring Security 依賴 Spring 容器;
⑥ shiro 不僅僅可以使用在 web 中,它可以工作在任何應用環境中。在集群會話時 Shiro 最重要的一個好處或許就是它的會話是獨立于容器的。
4 基本功能
功能相關介紹:
① Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份;
② Authorization:授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用 戶是否能進行什么操作,如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶 對某個資源是否具有某個權限;
③ Session Manager:會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的 所有 信息都在會話中;會話可以是普通 JavaSE 環境,也可以是 Web 環境的;
④ Cryptography:加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;
⑤ Web Support:Web 支持,可以非常容易的集成到 Web 環境;
⑥ Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權限不必每次去查,這樣可 以提高效率;
⑦ Concurrency:Shiro 支持多線程應用的并發驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去;
⑧ Testing:提供測試支持;
⑨ Run As:允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
⑩ Remember Me:記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了
5 原理
Shiro 架構(外部)
從外部來看 Shiro ,即從應用程序角度的來觀察如何使用Shiro 完成工作
????????任何一個需要進行安全身份校驗的對象Subject進來,ShiroSecurityManager安全管理器處使用Shiro的各種組件進行身份校驗。從Realm獲取相關需要校驗的安全數據。
Shiro 架構
- Subject:應用代碼直接交互的對象是 Subject,也就是說 Shiro 的對外API核心就是 Subject。Subject 代表了當前“用戶”, 這個用戶不一定是一個具體的人,與當前應用交互的任何東西都是 Subject,如網絡爬蟲, 機器人等;與 Subject 的所有交互 都會委托給 SecurityManager; Subject 其實是一個門面,SecurityManager 才是實際的執行者;
- SecurityManager:安全管理器;即所有與安全有關的操作都會與 SecurityManager交互;且其管理著所有 Subject;可以看出它是 Shiro 的核心,它負責與 Shiro 的其他組件進行交互,它相當于 SpringMVC 中 DispatcherServlet 的角色
- Realm:Shiro 從 Realm 獲取安全數據(如用戶、角色、權限),就是說SecurityManager 要驗證用戶身份,那么它需要從 Realm 獲取相應的用戶 進行比較以確定用戶身份是否合法;也需要從 Realm 得到用戶相應的角色/ 權限進行驗證用戶是否能進行操作;可以把 Realm 看成 DataSource
shiro架構(內部)
- Subject:任何可以與應用交互的“用戶”;
- SecurityManager :相當于 SpringMVC 中的 DispatcherServlet;是 Shiro 的心臟; 所有具體的交互都通過 SecurityManager 進行控制;它管理著所有 Subject、且負責進 行認證、授權、會話及緩存的管理。
- Authenticator:負責 Subject 認證,是一個擴展點,可以自定義實現;可以使用認證策略(Authentication Strategy),即什么情況下算用戶認證通過了;
- Authorizer:授權器、即訪問控制器,用來決定主體是否有權限進行相應的操作;即控制著用戶能訪問應用中的哪些功能;
- Realm:可以有 1 個或多個 Realm,可以認為是安全實體數據源,即用于獲取安全實體的;可以是 JDBC 實現,也可以是內存實現等等;由用戶提供;所以一般在應用中都需要實現自己的 Realm;
- SessionManager:管理 Session 生命周期的組件;而 Shiro 并不僅僅可以用在 Web環境,也可以用在如普通的 JavaSE 環境
- CacheManager:緩存控制器,來管理如用戶、角色、權限等的緩存的;因為這些數據 基本上很少改變,放到緩存中后可以提高訪問的性能
- Cryptography:密碼模塊,Shiro 提高了一些常見的加密組件用于如密碼加密/解密。
基本使用
1.環境搭建
引入pom依賴:
<dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
</dependencies>
說明:Shiro獲取權限相關信息可以通過數據庫獲取,也可以通過ini配置文件獲取
這里演示從ini文件中獲取。
- 在resources目錄下創建ini文件
注:這里等號左邊的(如:zhangsan),就代表用戶名。等號右邊的(z3)就代表對應的密碼。