李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Shiro简介
Leefs
2019-12-17 AM
3259℃
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
下一篇
字符串--无意识的递归
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
前端
JavaSE
RSA加解密
锁
字符串
Quartz
Java工具类
Golang基础
设计模式
人工智能
SQL练习题
Zookeeper
Shiro
Jquery
DataX
散列
DataWarehouse
递归
二叉树
并发线程
MySQL
GET和POST
Git
BurpSuite
随笔
链表
微服务
Http
Typora
Elastisearch
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭