Shiro權限框架簡介

       最近加入了gxpt項目組,被安排作權限模塊,因此也有幸第一次接觸到了Shiro框架。讓咱們來一塊兒領略Shiro的風采吧。java


什麼是Apache Shiro?

       Apache Shiro(發音爲「shee-roh」,日語「堡壘(Castle)」的意思)是一個強大易用的Java安全框架,提供了認證、受權、加密和會話管理功能,可爲任何應用提供安全保障 - 從命令行應用、移動應用到大型網絡及企業應用。mysql


       你能夠用 Apache Shiro作下面的事情: 
sql

    • 驗證用戶apache

    • 對用戶執行訪問控制,如: 設計模式

      • 判斷用戶是否擁有角色adminapi

      • 判斷用戶是否擁有訪問的權限緩存

    • 在任何環境下使用 Session API安全

    • 可使用多個用戶數據源。例如一個是oracle用戶庫,另一個是mysql用戶庫網絡

    • 單點登陸(SSO)功能session

    • 「Remember Me」服務 ,相似購物車的功能,shiro官方建議開啓


       Shiro要想作成以上的事情,主要依賴於4大API

    • Authentication —— 認證,用戶身份識別,常被稱爲用戶「登陸」,who are you?

    • Authorization —— 受權,訪問控制過程,決定「誰」訪問「什麼」,who can do what?

    • Session Management —— 會話管理,用戶session管理器,用戶相關的時間敏感的狀態

    • Cryptography —— 密碼加密,把JDK中複雜的密碼加密方式進行封裝,保護或隱藏數據防止被偷窺

       Shiro還支持一些輔助特性,如Web應用安全、緩存、單元測試和多線程,它們的存在強化了上面提到的四個要素。


爲何要用Shiro?

       雖然目前有其餘安全框架,好比 JAAS,Spring Security,可是仍有使人信服的理由讓你選擇Shiro:

    • 易於使用 —— 可讓新手都能很快上手,應用安全的開發與管理將再也不是一種痛苦

    • 靈活性 —— 能夠工做在任何應用環境中。雖然它工做在Web、EJB和IoC環境中,但並不依賴這些環境。既不強加任何規範,也無需過多依賴。

    • Web能力 —— 對Web應用的支持很神奇,容許你基於應用URL和Web協議(如REST)建立靈活的安全策略,同時還提供了一套控制頁面輸出的JSP標籤庫。

    • 熱插拔 —— Shiro乾淨的API和設計模式使它能夠方便地與許多的其餘框架和應用進行無縫集成。

Shiro大致框架

       要想快速瞭解Shiro,必須先從總體上去了解它,先說說它的高度歸納框架:


       Shiro包含三個核心組件:Subject,SecurityManager 和 Realms。具體來講:

       Subject 是與程序進行交互的對象,能夠是人也能夠是服務或者其餘,一般就理解爲用戶。

       全部Subject 實例都必須綁定到一個SecurityManager上。咱們與一個 Subject 交互,運行時shiro會自動轉化爲與 SecurityManager交互的特定 subject的交互。


       SecurityManager 是 Shiro的核心,初始化時協調各個模塊運行。

       當SecurityManager協調完畢,SecurityManager 會被單獨留下,且咱們只須要去操做Subject便可,無需操做SecurityManager 。 可是咱們得知道,當咱們正與一個 Subject 進行交互時,實質上是 SecurityManager在處理 Subject 安全操做。


       Realms在 Shiro中做爲應用程序和安全數據之間的「橋樑」或「鏈接器」。

       它獲取安全數據來判斷subject是否可以登陸,subject擁有什麼權限。有點相似DAO。在配置realms時,須要至少一個realm。並且Shiro提供了一些經常使用的 Realms來鏈接數據源,如LDAP數據源的JndiLdapRealm,JDBC數據源的JdbcRealm,ini文件數據源的IniRealm,properties文件數據源的PropertiesRealm等等。咱們也能夠插入本身的 Realm實現來表明自定義的數據源。 像其餘組件同樣,Realms也是由SecurityManager控制


Shiro總體框架

       簡單瞭解了一下大致的框架,如今讓咱們一塊兒來目擊Shiro的「芳容」吧:

  • Subject (org.apache.shiro.subject.Subject):
    簡稱用戶,解釋同上。

  • SecurityManager (org.apache.shiro.mgt.SecurityManager)
    如上所述,SecurityManager是shiro的核心,協調shiro的各個組件。

    • Authenticator (org.apache.shiro.authc.Authenticator):
      用戶身份驗證組件,登陸控制。

  • Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy)
    若是存在多個realm,則接口AuthenticationStrategy會肯定什麼樣算是登陸成功(例如,若是一個Realm成功,而其餘的均失敗,是否登陸成功?)。 

  • Authorizer (org.apache.shiro.authz.Authorizer) :
    訪問控制組件,決定subject能擁有什麼樣角色或者權限。

  • SessionManager (org.apache.shiro.session.SessionManager) :
    建立和管理用戶session。經過設置這個管理器,shiro能夠在任何環境下使用session。

    • SessionDao (org.apache.shiro.mgt.eis.SessionDao):
      表明SessionManager執行Session持久化(CURD)操做。

  • CacheManager (org.apahce.shiro.cache.CacheManager) :
    緩存管理器,能夠減小沒必要要的後臺訪問。提升應用效率,增長用戶體驗。

  • Cryptography(org.apache.shiro.crypto.*) :
    Shiro的api大幅度簡化java api中繁瑣的密碼加密。

  • Realms(org.apache.shiro.realm.Realm) : 程序與安全數據的橋樑