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