1. 程式人生 > >手把手實現Java權限(1)-Shiro介紹

手把手實現Java權限(1)-Shiro介紹

註入 gmv authent 高性能 高效率 可用 currency 界面 當前

功能介紹
技術分享 Authentication :身份認證/登錄。驗證用戶是不是擁有對應的身份;
Authorization :授權,即權限驗證。驗證某個已認證的用戶是否擁有某個權限;即推斷用
戶能否做事情,常見的如:驗證某個用戶是否擁有某個角色。

或者細粒度的驗證某個用
戶對某個資源是否具有某個權限;
Session Manager :會話管理。即用戶登錄後就是一次會話,在沒有退出之前,它的全部信
息都在會話中;會話能夠是普通 JavaSE 環境的,也能夠是如 Web 環境的。
Cryptography :加密,保護數據的安全性。如password加密存儲到數據庫,而不是明文存儲;
Web Support :Web 支持,能夠很easy的集成到 Web 環境。
Caching:緩存,比方用戶登錄後。其用戶信息、擁有的角色/權限不必每次去查,這樣能夠
提高效率;
Concurrency :shiro 支持多線程應用的並發驗證,即如在一個線程中開啟還有一個線程,能
把權限自己主動傳播過去;
Testing :提供測試支持;
Run As :同意一個用戶假裝為還有一個用戶(假設他們同意)的身份進行訪問;
Remember Me :記住我。這個是很常見的功能,即一次登錄後,下次再來的話不用登錄
了。




Subject :主體。能夠看到主體能夠是不論什麽能夠與應用交互的“用戶”;
SecurityManager : : 相 當 於 SpringMVC 中 的 DispatcherServlet 或 者 Struts2 中 的
FilterDispatcher;是 Shiro 的心臟;全部詳細的交互都通過 SecurityManager 進行控制;它管
理著全部 Subject、且負責進行認證和授權、及會話、緩存的管理。


Authenticator :認證器,負責主體認證的,這是一個擴展點,假設用戶認為 Shiro 默認的
不好。能夠自己定義實現。其須要認證策略(Authentication Strategy)。即什麽情況下算用戶
認證通過了;

Authrizer :授權器,或者訪問控制器。用來決定主體是否有權限進行對應的操作;即控制
著用戶能訪問應用中的哪些功能;
Realm :能夠有 1 個或多個 Realm,能夠覺得是安全實體數據源,即用於獲取安全實體的;
能夠是 JDBC 實現。也能夠是 LDAP 實現。或者內存實現等等;由用戶提供;註意:Shiro
不知道你的用戶/權限存儲在哪及以何種格式存儲。所以我們一般在應用中都須要實現自己
的 Realm。
SessionManager :假設寫過 Servlet 就應該知道 Session 的概念,Session 呢須要有人去管理
它的生命周期,這個組件就是 SessionManager;而 Shiro 並不只能夠用在 Web 環境,也
能夠用在如普通的 JavaSE 環境、EJB 等環境;全部呢,Shiro 就抽象了一個自己的 Session
來管理主體與應用之間交互的數據。這種話。比方我們在 Web 環境用,剛開始是一臺
Web server;接著又上了臺 EJB server;這時想把兩臺server的會話數據放到一個地方,
這個時候就能夠實現自己的分布式會話(如把數據放到 Memcached server);
SessionDAO: : DAO 大家都用過, 數據訪問對象。 用於會話的 CRUD, 比方我們想把 Session
保存到數據庫,那麽能夠實現自己的 SessionDAO。通過如 JDBC 寫到數據庫;比方想把
Session 放到 Memcached 中。能夠實現自己的 Memcached SessionDAO;另外 SessionDAO
中能夠使用 Cache 進行緩存,以提高性能;
CacheManager :緩存控制器。來管理如用戶、角色、權限等的緩存的。由於這些數據基本
上非常少去改變,放到緩存中後能夠提高訪問的性能
Cryptography :password模塊,Shiro 提高了一些常見的加密組件用於如password加密/解密的。
到此 Shiro 架構及其組件就認識完了。接下來挨著學習 Shiro 的組件吧。 基本表結構

技術分享 資源:表示菜單元素、頁面button元素等。菜單元素用來顯示界面菜單的,頁面button是每一個 頁面可進行的操作,如新增、改動、刪除button;使用 type 來區分元素類型(如 menu 表示 菜單。button 代表按鈕),priority 是元素的排序。如菜單顯示順序;permission 表示權限; 如用戶菜單使用 user:*。也就是把菜單授權給用戶後。用戶就擁有了 user:*權限;如用戶新 增button使用 user:create,也就是把用戶新增button授權給用戶後,用戶就擁有了 user:create 權 限了。available 表示資源是否可用。如菜單顯示/不顯示。
角色:role 表示角色標識符。如 admin,用於後臺推斷使用。description 表示角色描寫敘述,如 超級管理員,用於前端顯示給用戶使用;resource_ids 表示該角色擁有的資源列表,即該角 色擁有的權限列表(顯示角色),即角色是權限字符串集合。available 表示角色是否可用。



組 織 機 構:name 表示組織機構名稱。priority 是組織機構的排序,即顯示順序;available 表示組織機構是否可用。

用戶:username 表示用戶名;role_ids 表示用 戶擁有的角色列表,能夠通過角色再獲取其權限字符串列表;locked 表示用戶是否鎖定。



Shiro系統架構
技術分享 Subject :主體,能夠看到主體能夠是不論什麽能夠與應用交互的“用戶”;
SecurityManager : : 相 當 於 SpringMVC 中 的 DispatcherServlet 或 者 Struts2 中 的
FilterDispatcher;是 Shiro 的心臟。全部詳細的交互都通過 SecurityManager 進行控制。它管
理著全部 Subject、且負責進行認證和授權、及會話、緩存的管理。


Authenticator :認證器,負責主體認證的,這是一個擴展點。假設用戶認為 Shiro 默認的
不好,能夠自己定義實現;其須要認證策略(Authentication Strategy),即什麽情況下算用戶
認證通過了;
Authrizer :授權器,或者訪問控制器。用來決定主體是否有權限進行對應的操作。即控制
著用戶能訪問應用中的哪些功能;
Realm :能夠有 1 個或多個 Realm。能夠覺得是安全實體數據源。即用於獲取安全實體的;
能夠是 JDBC 實現,也能夠是 LDAP 實現,或者內存實現等等;由用戶提供;註意:Shiro
不知道你的用戶/權限存儲在哪及以何種格式存儲。所以我們一般在應用中都須要實現自己
的 Realm;
SessionManager :假設寫過 Servlet 就應該知道 Session 的概念,Session 呢須要有人去管理
它的生命周期,這個組件就是 SessionManager。而 Shiro 並不只能夠用在 Web 環境,也
能夠用在如普通的 JavaSE 環境、EJB 等環境。全部呢,Shiro 就抽象了一個自己的 Session
來管理主體與應用之間交互的數據;這種話,比方我們在 Web 環境用。剛開始是一臺
Web server;接著又上了臺 EJB server。這時想把兩臺server的會話數據放到一個地方,
這個時候就能夠實現自己的分布式會話(如把數據放到 Memcached server);
SessionDAO: : DAO 大家都用過。 數據訪問對象, 用於會話的 CRUD, 比方我們想把 Session
保存到數據庫,那麽能夠實現自己的 SessionDAO,通過如 JDBC 寫到數據庫;比方想把
Session 放到 Memcached 中,能夠實現自己的 Memcached SessionDAO;另外 SessionDAO
中能夠使用 Cache 進行緩存。以提高性能。
CacheManager :緩存控制器,來管理如用戶、角色、權限等的緩存的;由於這些數據基本
上非常少去改變,放到緩存中後能夠提高訪問的性能
Cryptography :password模塊,Shiro 提高了一些常見的加密組件用於如password加密/解密的。 Shiro用戶流程
Shiro 不會去維護用戶、維護權限;這 些須要我們 自己去 設計/ 提供 ; 然後通過
對應的 接口註入給 給 Shiro 就可以。
對於一個好的框架,從外部來看應該
具有很easy易於使用的 API,且 API 契約明白。從內部來看的話,其應該有一個可擴展
的架構,即很easy插入用戶自己定義實現,由於不論什麽框架都不能滿足全部需求。
首先。我們從外部來看 Shiro 吧,即從應用程序角度的來觀察怎樣使用 Shiro 完畢工作。如
下圖:
技術分享 能夠看到: 應用代碼直接交互的對象是Subject。 也就是說Shiro的對外API核心就是Subject;
其每一個 API 的含義:
Subject :主體。代表了當前“用戶”,這個用戶不一定是一個詳細的人。與當前應用交互
的不論什麽東西都是 Subject,如網絡爬蟲。機器人等;即一個抽象概念。全部 Subject 都綁定
到 SecurityManager。與 Subject 的全部交互都會托付給 SecurityManager;能夠把 Subject 認
為是一個門面;SecurityManager 才是實際的運行者。
SecurityManager :安全管理器;即全部與安全有關的操作都會與 SecurityManager 交互;
且它管理著全部 Subject。能夠看出它是 Shiro 的核心,它負責與後邊介紹的其它組件進行
交互,假設學習過 SpringMVC,你能夠把它看成 DispatcherServlet 前端控制器;

Realm: : 域。 Shiro 從從 Realm 獲取安全數據 (如用戶、 角色、 權限) , 就是說 SecurityManager
要驗證用戶身份。 那麽它須要從 Realm 獲取對應的用戶進行比較以確定用戶身份是否合法; 也須要從 Realm 得到用戶對應的角色/權限進行驗證用戶能否進行操作; 能夠把 Realm 看
成 DataSource。即安全數據源。



也就是說對於我們而言。最簡單的一個 Shiro 應用:
1、 應用代碼通過 Subject 來進行認證和授權。而 Subject 又托付給 SecurityManager;
2、 我們須要給 Shiro 的 SecurityManager 註入 Realm,從而讓 SecurityManager 能得到合法
的用戶及其權限進行推斷。


點擊打開鏈接


手把手實現Java權限(1)-Shiro介紹