李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Shiro简介
Leefs
2019-12-17 AM
5163℃
1条
# Shiro简介 ### 一、简介 shiro是Apache的开源安全框架,提供了登录认证、授权、加密、会话管理、缓冲管理等功能。不仅适用于JavaSE而且还适用于JavaEE. > + 1.认证--用户身份识别,常被称为用户“登录”; > + 2.授权--访问控制; > + 3.密码加密--保护或隐藏数据防止被偷窥; > + 4.会话管理--对用户相关的时间敏感的状态。 ### 二、基本功能 ![Shiro01.png][1] | 序号 | 功能 | 说明 | | ---- | ------------------- | ------------------------------------------------------------ | | 1 | **Authentication** | 身份认证/登录,验证用户是不是拥有相应的身份 | | 2 | **Authorization** | 授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限; | | 3 | **Session Manager** | 会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的 | | 4 | **Cryptography** | 加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储; | | 5 | **Web Support** | Web支持,可以非常容易的集成到Web环境; | | 6 | **Caching** | 缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率; | | 7 | **Concurrency** | shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去 | | 8 | **Testing** | 提供测试支持 | | 9 | **Run As** | 允许一个用户假装为另一个用户(如果他们允许)的身份进行访问 | | 10 | **Remember Me** | 记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了 | ### 三、Shiro工作流程 ![Shiro02.png][2] > + 1.**Subject:**主体,是与程序进行交互的对象,可以是人也可以是服务或者其他程序,通常理解为用户。所有的Subject实例都必须绑定到一个SecurityManager上。我们与Subject交互,运行时shiro会自动转化为与SecurityManager交互的特定的subject的交互。 > + 2.**SecurityManager:**SecurityManager是shiro的核心,初始化时协调各个模块运行。然而,一旦SecurityManager协调完毕,SecurityManager会被单独留下,且我们只需要去操作Subject即可,无需操作SecurityManager。但是需要了解的是当前我们与一个Subject进行交互时,实质上是SecurityManager在处理Subject的安全操作。 > + 3.**Realms:**Realms在shiro中是程序和安全数据之间的“桥梁”或“连接器”。它用于获取安全数据来判断subject是否可以登陆,subject拥有什么权限。在配置realms时,需要至少一个realm。而且shiro还提供了一些常用的realms来连接数据源如LDAP数据源的JndiLdapRealm,JDBC数据源的JdbcRealm,ini文件数据源的iniRealm,Properties文件数据源的PropertiesRealm,等等,我们也可以插入自己的Realm实现来代表自定义的数据源。像其他组件一样,Realms也是由SecurityManager控制。 对Shiro简单的理解: > 1. 1.应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager; > 2. 2.我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。 ### 四、Shiro架构 ![Shiro03.png][3] | 序号 | 方法 | 说明 | | ---- | ------------------- | ------------------------------------------------------------ | | 1 | **Subject** | 即主体,简称用户,主体既可以是用户也可以是程序,主体访问系统,系统需要对主体进行认证、授权。外部应用与subject进行交互,Subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授权相关的方法,外部程序通过subject进行认证授权,而Subject是通过SecurityManager安全管理器进行认证授权。 | | 2 | **SecurityManager** | SecurityManager是shiro的核心,协调shiro的各个组件。SecurityManager就是安全管理器,负责对全部的subject进行安全管理。通过SecurityManager可以完成Subject的认证、授权等,实质上SecurityManager是通过Authenticator对主体进行认证,通过Authorizer对主体进行授权,通过SessionManager进行会话管理等等。SecurityManager是一个接口,继承了Authenticator,Authorizer,SessionManager这三个接口。 | | 3 | **Authenticator** | 认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。 | | 4 | **Authorizer** | 授权器,用户在通过认证器认证通过后,在访问时需要通过授权器判断用户是否有此功能的操作权限。最终是通过认证器对主体进行授权的。 | | 5 | **Realm** | 领域,相当于DataSource数据源,通过Realm存取认证、授权相关数据。SecurityManager通过认证器对主体进行安全认证需要通过Realm获取用户身份数据,比如:如果用户身份数据在数据库,那么Realm就需要从数据库获取用户的身份信息。授权也是如此,也需要通过Realm取出授权相关信息。注意:不要将Realm理解成只是从数据源获取数据,在Realm中还有认证授权校验的相关代码 | | 6 | **SessionManager** | 会话管理。web应用中一般是web容器对Session进行管理,shiro框架定义了一套会话管理,它不依赖于web容器的Session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点进行管理,此特性可使它实现单点登录。 | | 7 | **SessionDAO** | 会话dao,是对Session会话操作的一套接口,比如要将Session存储到数据库,可以通过JDBC将会话存储到数据库。针对个性化的Session数据存储(存到数据库)需要使用SessionDAO。 | | 8 | **CacheManager** | 缓存管理器,主要对Session和授权数据进行缓存,比如将授权数据通过cachemanager进行缓存管理,和ehcache整合对缓存数据进行管理,可以减少不必要的后台访问,提高应用效率,增加用户体验。 | | 9 | **Cryptography** | 密码管理,提供了一套加密/解密组件,对JDK中的加密解密算法进行了封装,方便开发。比如提供常用的散列、加/解密等功能,比如MD5散列算法。 | ### 五、Shiro认证过程 ![Shiro05.png][4] 流程如下: > 1. 1.应用程序构建了一个终端用户认证信息AuthenticationToken实例后,调用Subject.login方法。 > 2. 2.Subject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的SecurityManager实例调用SecurityManager.login(token)方法。 > 3. 3.SecurityManager接受到token(令牌)信息后会委托内置的Authenticator的实例(通常是ModularRealmAuthenticator类的实例)调用authenticator.authenticate(token)。ModularRealmAuthenticator在认证过程中会对设置的一个或者多个Realm实例进行适配,它实际上为shiro提供了一个可插拔的认证机制。 > 4. 4.如果在应用程序中配置Realm,ModularRealmAuthenticator会根据配置的AuthenticationStrategy(认证策略)来进行多Realm的认证过程。在Realm被调用后,AuthenticationStrategy将对没有给Realm的结果做出响应。注意:如果应用程序中仅配置了一个Realm,Realm将被直接调用而无需在配置认证策略。 > 5. 5.判断每一个Realm是否支持提交的token,如果支持,Realm将调用getAuthenticationInfo(token);getAuthenticationInfo方法就是实际认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理。 **shiro认证的流程图如下:** ![Shiro06.png][5] *附:[参考文章链接1](https://www.jianshu.com/p/06234968716d)* [1]: https://lilinchao.com/usr/uploads/2019/12/1668589107.png [2]: https://lilinchao.com/usr/uploads/2019/12/1578253716.png [3]: https://lilinchao.com/usr/uploads/2019/12/998984902.png [4]: https://lilinchao.com/usr/uploads/2019/12/784612962.png [5]: https://lilinchao.com/usr/uploads/2019/12/4254969673.png
标签:
Java
,
Shiro
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/297.html
上一篇
重载“+”与StringBuilder
下一篇
字符串--无意识的递归
取消回复
评论啦~
提交评论
唉呀 ~ 仅有一条评论
茂林
高端,现在这些都是servlet手敲
回复
2019-12-18 10:50
栏目分类
随笔
2
Java
326
大数据
229
工具
35
其它
25
GO
48
NLP
8
标签云
JavaScript
查找
Ubuntu
Java工具类
Http
排序
Livy
GET和POST
Filter
nginx
并发线程
Jenkins
Azkaban
SpringCloud
微服务
Netty
pytorch
LeetCode刷题
Python
Ray
队列
MyBatis-Plus
Java编程思想
字符串
Spring
Java
设计模式
随笔
Linux
Redis
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
高端,现在这些都是servlet手敲