SpringMVC整合Shiro安全架構(一),springmvcshiro
一. 準備工作
1. 本文參考自張開濤的 《跟我學Shiro》
二. 簡介
1. Apache Shiro是Java的一個安全架構。可以協助我們完成:認證、授權、加密、會話管理、與Web整合、緩衝等。其準系統點如所示:
Authentication:身份認證/登入,驗證使用者是不是擁有相應的身份;Authorization:授權,即許可權驗證,驗證某個已認證的使用者是否擁有某個許可權;即判斷使用者是否能做事情,常見的如:驗證某個使用者是否擁有某個角色。或者細粒度的驗證某個使用者對某個資源是否具有某個許可權;Session Manager:會話管理,即使用者登入後就是一次會話,在沒有退出之前,它的所有資訊都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;Cryptography:加密,保護資料的安全性,如密碼加密儲存到資料庫,而不是明文儲存;Remember Me:記住我,這個是非常常見的功能,即一次登入後,下次再來的話不用登入了。
2. 從應用程式角度的來觀察如何使用Shiro完成工作。如:
Subject:主體,代表了當前“使用者”,這個使用者不一定是一個具體的人,與當前應用互動的任何東西都是Subject,如網路爬蟲,機器人等;即一個抽象概念;所有Subject都綁定到SecurityManager,與Subject的所有互動都會委託給SecurityManager;可以把Subject認為是一個門面;SecurityManager才是實際的執行者;SecurityManager:安全管理器;即所有與安全有關的操作都會與SecurityManager互動;且它管理著所有Subject;可以看出它是Shiro的核心,它負責與後邊介紹的其他組件進行互動,如果學習過SpringMVC,你可以把它看成DispatcherServlet前端控制器;Realm:域,Shiro從從Realm擷取安全資料(如使用者、角色、許可權),就是說SecurityManager要驗證使用者身份,那麼它需要從Realm擷取相應的使用者進行比較以確定使用者身份是否合法;也需要從Realm得到使用者相應的角色/許可權進行驗證使用者是否能進行操作;可以把Realm看成DataSource,即安全資料來源。
3. 從Shiro內部來看下Shiro的架構,如所示:
Subject:主體,可以看到主體可以是任何可以與應用互動的“使用者”;SecurityManager:相當於SpringMVC中的DispatcherServlet;是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伺服器;接著又上了台EJB伺服器;這時想把兩台伺服器的會話資料放到一個地方,這個時候就可以實現自己的分布式會話(如把資料放到Memcached伺服器);SessionDAO:DAO大家都用過,Data Access Objects,用於會話的CRUD,比如我們想把Session儲存到資料庫,那麼可以實現自己的SessionDAO,通過如JDBC寫到資料庫;比如想把Session放到Memcached中,可以實現自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache進行緩衝,以提高效能;CacheManager:緩衝控制器,來管理如使用者、角色、許可權等的緩衝的;因為這些資料基本上很少去改變,放到緩衝中後可以提高訪問的效能Cryptography:密碼模組,Shiro提高了一些常見的加密組件用於如密碼加密/解密的。