前言:
大家做登录,权限什么的都是五花八门,各种花里胡哨的代码,不同系统的做法很有可能千差万别。但是使用shiro这个安全框架之后,大家做权限的方式都一致化了,这样的好处就是你的代码看起来容易,我的代码你也好理解。shiro也比较成熟,基本上满足大部分的权限需要。
什么是Shiro
Apache Shiro是一个功能强大、灵活的,开源的安全(权限)框架。它将软件系统的安全认证向相关的功能抽取出来,实现用户身份认证,权限授权,加密,会话管理等功能,组成一个通用的安全认证框架。
Shiro和Spring Security比较
都是用来做项目中的权限管理
简单易用,只需要花费很少的时间。
符合公司的业务需求 和开发成本,团队的学习成本
Shiro 致力在所有应用环境下实现上述功能,小到命令行应用程序,大到企业应用中,而且不 需要借助第三方框架、容器、应用服务器等。当然 Shiro 的目的是尽量的融入到这样的应用环 境中去,但也可以在它们之外的任何环境下开箱即用。
写代码
为什么要用shiro
使用shiro就可以非常快速的完成认证,授权等功能的开发,降低系统的成本时间
shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中使用shiro的用户也越来越多
什么是权限管理
shiro主要是完成权限管理
基本涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴(只要有人的参与都要进行权限管理),权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份验证和授权两部分,简称认证授权,对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限可访问。
shiro有什么用
验证用户来核实他们的身份
1.对用户执行访问控制:①判断用户是否被分配了一个确定安全的角色
②判断用户是否被允许做某事
2.在任何环境下使用Session API,即使没有Web或EJB容器。
3.在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。
4.聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。
5.启用单点登录(SSO)功能。
6.为没有关联到登录的用户启用"Remember Me"服务
7.以及更多——全部集成到紧密结合的易于使用的API中
Shiro 视图在所有应用程序环境下实现这些目标——从最简单的命令行应用程序到最大的企业应用,不强制依赖其他第三方框架,容器,或应用服务器。当然,该项目的目标是尽可能地融入到这些环境,但它能够在任何环境下立即可用。
Shiro特性
全面的,蕴含丰富功能的安全框架
Authentication(认证):通常被称为“登录” ,是一个证明当前用户的身份是否是 所说的用户的行为
Authorization(授权):访问控制的过程。就是某个用户是否具有某个访问的权限 或某个操作的使用权限。
Session Management(会话管理):即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
Cryptography(加密):在对数据源使用加密算法加密的同时,保证易于使用。
保护数据的安全性,例如密码加密存储到数据库,而不是 通过明文存储。
还有其他功能来支持和加强这些不同应用环境下安全领域的关注点,特别是对一下功能的支持:
Web支持:Shiro 提供的 web 支持 api ,可以很轻松的保护 web 应用程序的安 全。
缓存:例如用户登录之后,其用户信息,用户角色权限等都不需要每次都进行查 询,是 Apache Shiro 保证安全操作快速、高效的重要手段。
并发: shiro支持多线程应用并发验证,即在一个线程中开启另一个线程能够把 权限自动传播过去
测试:支持单元测试和集成测试,确保代码和预想的一样安全。
"Run As":这个功能允许用户假设另一个用户的身份(在许可的前提下),有时候再管 理脚本很有用
"Remember Me":跨 session 记录用户的身份,只有在强制需要时才需要登录。
Shiro架构
Shiro的三个核心组件
Subject
Subject:即“当前操作用发户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager
SecurityManager是Shiro架构的心脏,并作为一种“保护伞”对象来协调内部的安全组件共同构成一个对象图。然而,一旦SecurityManager和它的内置对象图已经配置给一个应用程序,那么它单独留下来,且应用程序开发人员几乎使用他们所有的时间来处理Subject API。
稍后会更详细地讨论SecurityManager,但重要的是要认识到,当你正与一个Subject进行交互时,实质上是幕后的 SecurityManager处理所有繁重的Subject安全操作。这反映在上面的基本流程图。
Realm
Realms担当Shiro和你的应用程序的安全数据之间的“桥梁”或“连接器”。当它实际上与安全相关的数据如用来执行身份验证(登录)及授权(访问控制)的用户帐户交互时,Shiro 从一个或多个为应用程序配置的Realm中寻找许多这样的东西。
在这个意义上说,Realm本质上是一个特定安全的DAO:它封装了数据源的连接详细信息,使Shiro所需的相关的数据可用。当配置Shiro时,你必须指定至少一个Realm用来进行身份验证和/或授权。SecurityManager可能配置多个Realms,但至少有一个是必须的。
Shiro提供了立即可用的Realms来连接一些安全数据源(即目录),如LDAP,关系数据库(JDBC),文本配置源,像 INI 及属性文件,以及更多。你可以插入你自己的Realm 实现来代表自定义的数据源,如果默认地Realm不符合你的需求。
像其他内置组件一样,Shiro SecurityManager控制 Realms是如何被用来获取安全和身份数据来代表 Subject 实例的。
工作流程
用户、角色、权限
会给角色赋予权限,给用户赋予角色
1、UsernamePasswordToken,Shiro 用来封装用户登录信息,使用用户的登录信息来创建令牌 Token。
2、SecurityManager,Shiro 的核心部分,负责安全认证和授权。
3、Suject,Shiro 的一个抽象概念,包含了用户信息。
4、Realm,开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在 Realm 中。
5、AuthenticationInfo,用户的角色信息集合,认证时使用。
6、AuthorzationInfo,角色的权限信息集合,授权时使用。
7、DefaultWebSecurityManager,安全管理器,开发者自定义的 Realm 需要注入到 DefaultWebSecurityManager 进行管理才能生效。
8、ShiroFilterFactoryBean,过滤器工厂,Shiro 的基本运行机制是开发者定制规则,Shiro 去执行,具体的执行操作就是由 ShiroFilterFactoryBean 创建的一个个 Filter 对象来完成。
9.SimpleAuthorizationInfo()获取角色,获取权限
10.SimpleAuthenticationInfo()获取用户名,密码
下一期:Shiro教程+springboot整合shiro(二:代码学习)