权限管理框架Shiro简介
Shiro
1、shiro簡介
shiro是一個強(qiáng)大易用的java安全框架,可以幫助我們完成:身份認(rèn)證、授權(quán)、加密、會話管理、與web集成、緩存等。
包括了三個核心組件:Subject、SecurityManage和Realm
- 外部架構(gòu)
- 內(nèi)部架構(gòu)
authentication(認(rèn)證):/???θent??ke??n/ 確定用戶身份 用戶密碼驗證
authorization(授權(quán)): /???θ?ra??ze??n/ 對用戶訪問系統(tǒng)的資源進(jìn)行控制。后臺接口的訪問、前臺頁面元素的訪問、敏感數(shù)據(jù)
2、shiro主要的組件?
(1)Subject:主體,主體可以是任何與應(yīng)用交互的“用戶”;
(2)SecurityManager:所有具體的交互都通過SecurityManager進(jìn)行控制;它管理著所有Subject、且負(fù)責(zé)進(jìn)行認(rèn)證和授權(quán)、及會話、緩存的管理。
(3)Realm:可以有1個或多個Realm,可以認(rèn)為是安全實(shí)體數(shù)據(jù)源,即用于獲取安全實(shí)體的;可以是JDBC實(shí)現(xiàn),也可以是LDAP實(shí)現(xiàn),或者內(nèi)存實(shí)現(xiàn)等等;由用戶提供;注意:Shiro不知道你的用戶/權(quán)限存儲在哪及以何種格式存儲;所以我們一般在應(yīng)用中都需要實(shí)現(xiàn)自己的Realm;
(4)Authenticator:認(rèn)證器,負(fù)責(zé)對主體進(jìn)行認(rèn)證。用戶可以自定義實(shí)現(xiàn)自己的Anthentication;其需要認(rèn)證策略(Authentication Strategy),即什么情況下算用戶認(rèn)證通過了;
(5)Authorizer:授權(quán)器,或者訪問控制器,對用戶訪問系統(tǒng)的資源進(jìn)行控制。后臺接口的訪問、前臺頁面元素的訪問、敏感數(shù)據(jù)。
(6)SessionManager:管理Session生命周期的組件;通過sessionManageShiro不僅僅可以用在web環(huán)境,也可以用在javaSE環(huán)境
(7)SessionDAO:DAO大家都用過,數(shù)據(jù)訪問對象,用于會話的CRUD,比如我們想把Session保存到數(shù)據(jù)庫,那么可以實(shí)現(xiàn)自己的SessionDAO,通過如JDBC寫到數(shù)據(jù)庫;比如想把Session放到Memcached中,可以實(shí)現(xiàn)自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache進(jìn)行緩存,以提高性能;
(8)CacheManager:緩存控制器,來管理如用戶、角色、權(quán)限等的緩存的;因為這些數(shù)據(jù)基本上很少去改變,放到緩存中后可以提高訪問的性能
(9)Cryptography:密碼模塊,Shiro提供了一些常見的加密組件用于如密碼加密/解密的。
3、Shiro運(yùn)行原理是什么?
(1)Application Code:應(yīng)用程序代碼,就是我們自己的編碼,如果在程序中需要進(jìn)行權(quán)限控制,需要調(diào)用Subject的API;
(2)Subject:主體代表了當(dāng)前用戶。
(3)Security Manage:所有具體的交互都通過SecurityManager進(jìn)行控制;它管理著所有Subject、且負(fù)責(zé)進(jìn)行認(rèn)證和授權(quán)、及會話、緩存的管理。
(4)Realm:域shiro是從Realm來獲取安全數(shù)據(jù)(用戶,角色,權(quán)限)。
就是說Security Manager。要驗證用戶身份,那么它需要從Realm獲取相應(yīng)的用戶進(jìn)行比較以確定用戶身份是否 合法;也需要從Realm得到用戶相應(yīng)的角色/權(quán)限進(jìn)行驗證用戶是否能進(jìn)行操作;可以 把Realm看成DataSource,即安全數(shù)據(jù)源。
4、Shiro的權(quán)限控制方式是什么?
url 級別權(quán)限控制(粗粒度) 、方法注解權(quán)限控制 (細(xì)粒度)、代碼級別權(quán)限控制 、頁面標(biāo)簽權(quán)限控制
5、什么是粗顆粒和細(xì)顆粒權(quán)限?
答:對資源類型的管理稱為粗顆粒度權(quán)限控制,即只控制到菜單、按鈕、方法。粗粒度的例子比如:用戶具有用戶管理的權(quán)限,具有導(dǎo)出訂單明細(xì)的權(quán)限。
對資源實(shí)例的控制稱為細(xì)顆粒度權(quán)限管理,即控制到數(shù)據(jù)級別的權(quán)限,比如:用戶只允許修改本部門的員工信息,用戶只允許導(dǎo)出自己創(chuàng)建的訂單明細(xì)。
6、粗顆粒和細(xì)顆粒如何授權(quán)?
答:對于粗顆粒度的授權(quán)可以很容易做系統(tǒng)架構(gòu)級別的功能,即系統(tǒng)功能操作使用統(tǒng)一的粗顆粒度的權(quán)限管理。對于細(xì)顆粒度的授權(quán)不建議做成系統(tǒng)架構(gòu)級別的功能,因為對數(shù)據(jù)級別的控制是系統(tǒng)的業(yè)務(wù)需求,隨著業(yè)務(wù)需求的變更業(yè)務(wù)功能變化的可能性很大,建議對數(shù)據(jù)級別的權(quán)限控制在業(yè)務(wù)層個性化開發(fā),比如:用戶只允許修改自己創(chuàng)建的商品信息可以在service接口添加校驗實(shí)現(xiàn),service接口需要傳入當(dāng)前操作人的標(biāo)識,與商品信息創(chuàng)建人標(biāo)識對比,不一致則不允許修改商品信息。
粗顆粒權(quán)限:可以使用過慮器統(tǒng)一攔截url。
細(xì)顆粒權(quán)限:在service中控制,在程序級別來控制,個性化編程。
7、shiro的優(yōu)點(diǎn)都有什么?
答:簡單的身份驗證,支持多種數(shù)據(jù)源;對角色的簡單授權(quán),支持細(xì)粒度的授權(quán);支持一級緩存,以提升應(yīng)用程序的性能;適用于web及非web環(huán)境;非常簡單的API加密;不跟任何框架綁定,可以獨(dú)立運(yùn)行。
8、如何配置在Spring中配置使用 Shiro?
@Configuration public class ShiroConfig{//1、Realmpublic ShiroRealm getRealm(@Qualifier("hashedCredentialsMatcher") HashedCredentialsMatcher credentialsMatcher) {ShiroRealm realm = new ShiroRealm();}//2、SecurityManagerpublic DefaultWebSecurityManager getDefaultSecurityManager(@Qualifier("shiroRealm") ShiroRealm shiroRealm,@Qualifier("cache") EhCacheManager ehCacheManager,@Qualifier("sessionManager") SessionManager sessionManager){//關(guān)聯(lián)RealmsecurityManager.setRealm(shiroRealm);//設(shè)置session管理器securityManager.setSessionManager(sessionManager);}//3、創(chuàng)建ShiroFilterFactoryBean 請求過濾器public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){} }9、比較 [Spring Security](https://www.wkcto.com/courses/security.html和Shiro?
答:相比Spring Security, Shiro 在保持強(qiáng)大功能的同時, 使用簡單性和靈活性;Spring Security即使是一個一個簡單的請求,最少得經(jīng)過它的8個Filter;
Spring Security必須在Spring 的環(huán)境下使用。
10、Shiro認(rèn)證流程
1、首先調(diào)用Subject.login(token)進(jìn)行登錄,其會自動委托給Security Manager,調(diào)用之前必須通過SecurityUtils. setSecurityManager()設(shè)置;
2、SecurityManager負(fù)責(zé)真正的身份驗證邏輯;它會委托給Authenticator進(jìn)行身份驗證;
3、Authenticator才是真正的身份驗證者,Shiro API中核心的身份認(rèn)證入口點(diǎn),此處可以自定義插入自己的實(shí)現(xiàn);
4、Authenticator可能會委托給相應(yīng)的AuthenticationStrategy進(jìn)行多Realm身份驗證,默認(rèn)ModularRealmAuthenticator會調(diào)用AuthenticationStrategy進(jìn)行多Realm身份驗證;
5、Authenticator會把相應(yīng)的token傳入Realm,從Realm獲取身份驗證信息,如果沒有返回/拋出異常表示身份驗證失敗了。此處可以配置多個Realm,將按照相應(yīng)的順序及策略進(jìn)行訪問。
11、Shiro授權(quán)過程
1、如果Realm進(jìn)行授權(quán)的話,應(yīng)該繼承AuthorizingRealm,其流程是:
(1)如果調(diào)用hasRole*,則直接獲取AuthorizationInfo.getRoles()與傳入的角色比較即可;
(2)首先如果調(diào)用如isPermitted(“user:view”),首先通過PermissionResolver將權(quán)限字符串轉(zhuǎn)換成相應(yīng)的Permission實(shí)例
2、通過AuthorizationInfo.getObjectPermissions()得到Permission實(shí)例集合;通過AuthorizationInfo. getStringPermissions()得到字符串集合并通過PermissionResolver解析為Permission實(shí)例;然后獲取用戶的角色,并通過RolePermissionResolver解析角色對應(yīng)的權(quán)限集合(默認(rèn)沒有實(shí)現(xiàn),可以自己提供);
3、接著調(diào)用Permission. implies(Permission p)逐個與傳入的權(quán)限比較,如果有匹配的則返回true,否則false。
基本API(過程)
Subject currentUser = SecurityUtils.getSubject(); //獲得當(dāng)前用戶 Session session = currentUser.getSession(); //獲得session UsernamePasswordToken token = new UsernamePasswordToken("username","password"); //認(rèn)證 currentUser.login(token); //通過拋出的異常來判斷用戶的狀態(tài) 用戶是否存在 用戶名密碼是否正確 賬號是否鎖定 權(quán)限是否認(rèn)證通過 currentUser.getPrincipal() //用戶登錄的用戶名 //授權(quán) currentUser.hashRole() //判斷單個角色 currentUser.isPermitted() //判斷用戶權(quán)限 currentUser.logout(); //退出總結(jié)
以上是生活随笔為你收集整理的权限管理框架Shiro简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Unity】Unity寻路系统讲解及N
- 下一篇: 八字专业测试