导读
阅读人群
正文
介绍
特点
主要的四个功能
其他功能
架构
术语
本文用来记录学习Shiro安全框架,初衷是尽可能的小而全,短而精。但是文笔有限,建议看完本文以后阅读官方文档伴读。文档内容基本来自官网加上一点点一些自身理解,希望不要误导你。
如果你没有接触过Shiro或者其他安全框架建议从头部根据顺序看起,这样可能更容易理解。
如果你已经对Shiro有过一些了解可以根据目录接口选看。
如果你对Shiro足够了解,希望可以找到一些代码片段或者是想复制代码可以进入仓库(代码还没有写完无法跳转)。或者目录跳转到相关代码部分。
Apache Shiro 是一个强大而灵活的开源安全框架,可以干净地处理身份验证、授权、企业会话管理和加密。
Apache Shiro的首要目标是易于使用和理解。安全性有时可能非常复杂,甚至很痛苦,但并非必须如此。框架应尽可能掩盖复杂性,并公开一个干净直观的API,以简化开发人员确保其应用程序安全的工作。
以下是您可以使用Apache Shiro执行的一些操作:
对用户进行身份验证以验证其身份
对用户执行访问控制,例如:
确定是否为用户分配了特定安全角色
确定是否允许用户执行某些操作
在任何环境中使用会话 API,即使没有 Web 或 EJB 容器也是如此。
在身份验证、访问控制或会话生存期内对事件做出反应。
聚合 1 个或多个用户安全数据源,并将其全部呈现为单个复合用户“视图”。
启用单点登录 (SSO) 功能
启用“记住我”服务以进行用户关联,而无需登录
...
等等 - 全部集成到一个有凝聚力的易于使用的 API 中。
Shiro尝试为所有应用程序环境实现这些目标 - 从最简单的命令行应用程序到最大的企业应用程序,而不强制依赖其他第三方框架,容器或应用程序服务器。当然,该项目旨在尽可能集成到这些环境中,但它可以在任何环境中开箱即用。
Authentication 用户的认证
Authorization 访问控制
Session Management 会话管理,即使在非Web 或EJB应用程序也是可以使用
Cryptography 密码的加密
Web Support Shiro的Web支持Api 帮助轻松的保护Web应用程序
Caching Shiro的一级缓存,确保安全操作的同时保证快速高效
Concurrency 支持多线程应用程序的并发功能
Testing 支持单元和继承测试
Run As 允许用户可以使用其他用户的身份的功能
Remember 记住我,跨会话记住用户的身份
从架构上可以分为三个概念,subject、securityManager、reaim,Subject 可以理解为用户,实际不止代表用户也有可能是第三方服务、一个程序、定时任务等等,与软件进行交互的"实体"都可以称为Subject。securityManager 架构的核心,通过配置各种对象来完成业务逻辑,可以理解为钢铁侠的反应炉。Realm Shiro与数据源之间的桥梁,用于获取用户的数据。
更为详细的架构图
Subject 与软件交互的实体(用户、第三方服务、一个定时程序)
Security Manager Shrio的核心
authenticator 负责执行和响应用户身份的组件,当用户尝试登录时,由该逻辑执行
authenticationStrategy 如果配置多个(Realm)数据源,用于管理Realm的策略,例如一个realm中的用户数据与当前需要验证的用户数据对应上了就代表对应成功,还是所有的Realm都对应上才算成功
Authorizer 负责确定用户在应用程序中访问控制的组件
SessionManager 用户的会话管理
SessionDAO 持久性的管理用户的会话
CacheManager Shiro可以访问需要后端数据源进行身份验证,使用缓存可以大大提高效率,避免每次都直接查库
Cryptography 加密包,有Hash和不同编码解码器实现的表示
Realms 充当Shiro和数据源之间的桥梁
建议先了解相关术语,方便后面的阅读。举了一些例子用于说明这些术语可能不恰当,
Authentication:身份验证
验证主题身份的过程 - 用来验证某个人确实是他所说的人,例如 张三说他是张三 我们需要查看他的身份证查验这个人确实是张三,而不是随便一个人说他自己是张三就是张三。
Authorization:授权/访问控制
访问控制,用来验证某个主体或者人是否拥有某种权限,例如张三说天安门是他的不动产,我们需要验证天安门是否是他的不动产,如果张三有天安门的产权证那么天安门就是他的,这个过程就是访问控制。
身份验证和访问控制的单词很像很容易混淆,其实根据举例应该可以区分这两个的区别, 身份验证用来验证某个主体是否是合法的,访问控制用来验证合法的主题是否拥有某种权限。
Cipher:密码
用来执行加解密的算法
Credential:凭据
用来验证主体身份的一条信息,身份验证期间,将一条或多条凭据和主体一起提交,与身份验证例子中的身份证一样。
Cryptography:密码学
消息摘要,加密的一个过程和cipher 是分开的,暂时不知道区别
Hash:哈希
使用Hash算法进行消息摘要
Permission:权限
用于声明某个方法或者行为需要什么权限,安全策略中的最低级别,当需要验证权限时,就已经完成身份验证,角色验证了。实际就是一个字符串。例如在
Principal:主要的标识
可以理解为用户的标识,类似于键值对的Key,根据key就可以从其他地方获取Value 避免主体过大
Realm:数据源
数据访问对象,通过Realm对象获取用户的信息,底层用户可能会存储Ldap或Mariadb数据库中,通过Realm接口可以屏蔽底层数据库的差异,让获取用户的信息具有统一性
Role:角色
相比于权限,可以把角色理解为一个权限的集合,例如张三需要打扫一座大楼的卫生,大楼的每层需要开门权限才可以开门进去打扫卫生,如果每层都给张三进行授权,权限太多且不好管理,我们使用角色进行分配的话,给张三一个保洁的角色就可以开启大楼的每层大门
Session:会话
一段时间内与软件系统交互的单个用户/主题相关联有状态的数据上下文,举个例子我们去游乐园需要购买门票,游乐园有的项目只允许进去一次,所以游玩这些项目的时候门票会被扣个洞,用于记录我们已经体验过这个项目了,我们出游乐园的时候会回收门票,这个门票这就可以理解为数据上下文信息。
Subject:主体
访问项目的不单单是指用户,也有可能是一段程序,主体用来表示这个意思