权限管理框架--Shiro
2019-08-06 本文已影响0人
suxin1932
1.shiro概述
1.1shiro是什么
Apache Shiro是一个拥有许多功能的综合性的程序安全框架。
1.2shiro能做什么
1.验证用户来核实他们的身份
2.对用户执行访问控制,如:
>> 判断用户是否被分配了一个确定的安全角色;
>> 判断用户是否被允许做某事;
3.在任何环境下使用Session API,即使没有Web或EJB容器。
4.在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。
5.聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。
6.启用单点登录(SSO)功能。
7.为没有关联到登录的用户启用"Remember Me"服务
8.以及更多——全部集成到紧密结合的易于使用的API中。
1.3Shiro特性
#Shiro的“应用程序的四大基石”——身份验证,授权,会话管理, 加密
>> Authentication:有时也简称为“登录”,用户是否有账号。
>> Authorization:访问控制的过程,用户拥有哪些资源的访问权限。
>> Session Management:管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
>> Cryptography:通过使用加密算法保持数据安全同时易于使用。
#也提供了额外的功能来支持和加强在不同环境下所关注的方面,尤其是以下这些:
>> Web Support:Shiro的web支持的API能够轻松地帮助保护 Web 应用程序。
>> Caching:缓存是Apache Shiro中的第一层公民,来确保安全操作快速而又高效。
>> Concurrency:Apache Shiro利用它的并发特性来支持多线程应用程序。
>> Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。
>> "Run As":一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。
>> "Remember Me":在会话中记住用户的身份,所以他们只需要在强制时候登录。
Shiro特性.png
1.4shiro架构
#Subject(org.apache.shiro.subject.Subject)
当前与软件进行交互的实体(用户,第三方服务,cron job,等等)的安全特定“视图”。
#SecurityManager(org.apache.shiro.mgt.SecurityManager)
SecurityManager是Shiro架构的心脏。
它基本上是一个“保护伞”对象,协调其管理的组件以确保它们能够一起顺利的工作。
它还管理每个应用程序用户的Shiro 的视图,因此它知道如何执行每个用户的安全操作。
#Authenticator(org.apache.shiro.authc.Authenticator)
Authenticator是一个对执行及对用户的身份验证(登录)尝试负责的组件。
当一个用户尝试登录时,该逻辑被 Authenticator执行。
Authenticator知道如何与一个或多个Realm协调来存储相关的用户/帐户信息。
从这些Realm中获得的数据被用来验证用户的身份来保证用户确实是他们所说的他们是谁。
#AuthenticationStrategy(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果不止一个Realm被配置,则AuthenticationStrategy将会协调这些Realm来决定身份认证尝试成功或失败下的条件
(如果一个Realm成功,而其他的均失败,是否该尝试成功?是否所有的Realm必须成功?或只有第一个成功即可?)
#Authorizer(org.apache.shiro.authz.Authorizer)
Authorizer是负责在应用程序中决定用户的访问控制的组件。
它是一种最终判定用户是否被允许做某事的机制。
与 Authenticator相似,Authorizer也知道如何协调多个后台数据源来访问角色恶化权限信息。
Authorizer使用该信息来准确地决定用户是否被允许执行给定的动作。
#SessionManager(org.apache.shiro.session.SessionManager)
SessionManager知道如何去创建及管理用户Session生命周期来为所有环境下的用户提供一个强健的Session体验。
这在安全框架界是一个独有的特色——Shiro拥有能够在任何环境下本地化管理用户Session的能力,
即使没有可用的Web/Servlet或EJB容器,它将会使用它内置的企业级会话管理来提供同样的编程体验。
SessionDAO的存在允许任何数据源能够在持久会话中使用。
#SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
SesssionDAO代表SessionManager执行Session持久化(CRUD)操作。
这允许任何数据存储被插入到会话管理的基础之中。
#CacheManager(org.apahce.shiro.cache.CacheManager)
CacheManager创建并管理其他Shiro组件使用的Cache实例生命周期。
因为Shiro能够访问许多后台数据源,由于身份验证,授权和会话管理,
缓存在框架中一直是一流的架构功能,用来在同时使用这些数据源时提高性能。
任何现代开源和/或企业的缓存产品能够被插入到Shiro来提供一个快速及高效的用户体验。
#Cryptography(org.apache.shiro.crypto.*)
这是shiro的加密模块, 可以参考使用, 同时也需要注意其中的加密算法是否符合安全加密规范, 尤其是口令的加密。
#Realms(org.apache.shiro.realm.Realm)
Realms在Shiro和你的应用程序的安全数据之间担当“桥梁”或“连接器”。
当它实际上与安全相关的数据如用来执行身份验证(登录)及授权(访问控制)的用户帐户交互时,
Shiro从一个或多个为应用程序配置的Realm中寻找许多这样的东西。
你可以按你的需要配置多个Realm(通常一个数据源一个Realm),
且Shiro将为身份验证和授权对它们进行必要的协调。
shiro架构.png
1.5shiro的认证/登录流程
1.subject(主体)请求认证,调用subject.login(token)
2.SecurityManager (安全管理器)执行认证
3.SecurityManager通过ModularRealmAuthenticator进行认证。
4.ModularRealmAuthenticator将token传给realm,
realm根据token中用户信息从数据库查询用户信息(包括身份和凭证)
5.realm如果查询不到用户给ModularRealmAuthenticator返回null,
ModularRealmAuthenticator抛出异常(用户不存在)
6.realm如果查询到用户给ModularRealmAuthenticator返回AuthenticationInfo(认证信息)
7.ModularRealmAuthenticator拿着AuthenticationInfo(认证信息)去进行凭证(密码)比对。
如果一致则认证通过,如果不一致抛出异常(凭证错误)。
shiro-authenticator.png
1.6授权(鉴权)流程
1.对subject进行授权,调用方法isPermitted("*")或者hasRole("*")
2.SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
3.ModularRealmAuthorizer执行realm(自定义的CustomRealm)
从数据库查询权限数据调用realm的授权方法:doGetAuthorizationInfo
4.realm从数据库查询权限数据,返回ModularRealmAuthorizer
5.ModularRealmAuthorizer调用PermissionResolver进行权限串比对
6.如果比对后,isPermitted中"permission串"在realm查询到权限数据中,
说明用户访问permission串有权限,否则没有权限,抛出异常。
shiro-authorizer.png
https://blog.csdn.net/yhhyhhyhhyhh/article/details/84262689
https://www.jianshu.com/p/1647a30be927