Apache Shiro是一个功能强大,灵活的开源的安全框架,它可以干脆利落的处理身份验证、授权、企业会话管理和加密。
与spring security一样,都是一个作为权限管理的安全框架。但是与spring security相比,在于shiro使用了比较简单、易懂且易于使用的授权方式。
shiro官网:http://shiro.apache.org/
Apache Shiro特征
Apache Shiro是一个全面的、功能丰富的安全框架,如图描述了shiro的一些集中关注点。
其中绿色的四大块分别是认证(Authentication)、授权(Authorization)、会话管理(Session Management)、加密(Cryptography),它们被shiro的开发团队称之为应用程序安全的四大基石:
- 认证:用户的识别,通常被称为用户登录
- 授权:做访问控制,比如某个用户是否具有某个操作的使用权限
- 会话管理:特定于用户的会话管理
- 加密:对数据源使用加密算法加密保证数据安全,同时保证它容易使用
当然了,还有其他功能来支持和加强这些不同应用环境下安全领域的关注点,特别是对以下功能的支持:
- 首先是web的支持,shiro提供了web支持API,可以轻松的保护web应用程序的安全,
- 接下来是缓存,缓存是shiro保证安全操作快速高效的重要手段
- 并发:shiro支持多线程应用程序的并发特性
- 测试:支持单元测试和集成测试,确保代码和预想的一样安全
- 支持run as功能,这个功能允许用户假设另一个用户的身份,当然了,这是在许可的前提下才可以
- remember me功能,它可以跨session记录用户的身份,只有在强制需要时,才需要登录
这里需要注意,shiro不会去维护用户和权限,需要我们自己去设计和实现,然后提供相应的接口注入给shiro
高级别的概述
在概念层,shiro架构主要包含3个主要理念:subject、securitymanager、realm,下图为这些组件如何交互的高级概述图,我们分别介绍每个概念。
subject
主体,代表了当前用户,subject可以是一个人,也可以是第三方服务,守护进程的账户或者其他当前和软件交互的任何事件比如网络爬虫、机器人等,它是一个抽象的概念。
所有的subject都绑定到securitymanager,与subject所有的交互都会委托给securitymanager,可以把subject认为是一个门面,securitymanager才是一个实际的执行者。
SecurityManager
securitymanager是一个安全的管理器,即所有与安全有关的操作都会与securitymanager交互,它管理着所有的subject,可以看出它是shiro的核心,它负责与后面介绍的其他组件进行交互。
Realm
shiro从realm中获取安全数据,包括用户角色、权限等等,securitymanager要验证身份的话,需要从realm获取相应的用户,然后进行比较,以确定用户身份是否合法,也需要从realm中得到用户相应的角色以及权限进行验证用户是否能进行操作,可以把realm看成datasource,即安全的数据源
最简单的一个shiro应用,首先是应用代码通过subject来进行授权和认证,而subject又委托给securitymanager,我们需要给securitymanager注入realm,从而让securitymanager能够得到合法的用户及其权限进行判断。
Apache Shiro架构
接下来看一下Apache Shiro的架构图
Authenticator
这是用户认证管理器,这个组件主要是用于处理用户的登录逻辑,它通过调用realm的接口来判断登录用户的身份,这里涉及到用户认证策略,比如如果系统中配置了多个realm,则需要使用Authentication Strategy来协调这些realm以便决定一个用户的登录和认证是成功还是失败。
比如一个realm验证成功了,但是其他都失败了,这次认证是算成功还是失败呢,还是说必须所有的realm都成功了才算成功,或者第一个realm成功就算成功,因此我们需要一个策略,这个策略相对还是挺复杂的。
Authorizer
这是权限管理器,这个组件主要是用来做用户的访问控制,通俗来说,就是决定用户能做什么,不能做什么,和Authenticator类似,Authorizer它也知道怎么协调多个realm数据源的数据,它有自己的一套策略
Session Manager
会话管理器,它知道如何创建会话,管理用户会话的生命周期,以便在所有运行环境下都能给用户提供一个健壮的会话管理体验,shiro在任何环境下都可以在本地管理用户会话,即便没有web容器也可以,这在安全管理框架中算是独门绝技了。
当然如果当前环境中有会话管理机制,比如servlet容器,则shiro默认会使用该环境的会话管理机制,而如果像控制台这种独立的应用程序,本身没有会话管理机制的时候,shiro就会使用内部的会话管理器来给应用开发提供一致的编程体验。
Session Dao
它允许用户使用任何类型的数据源来存储session数据,它主要是用来代替Session Manager执行session相关的增删改查,这个接口允许我们将任意种类的数据、存储方式引入到session管理的基础框架之中。
Cache Manager
用于创建和维护一些在其他shiro组件中用到的cache实例,维护这些cache实例的生命周期,缓存用于存储那些从后端获取到的用户验证、及权限控制方面的数据来提高性能。在获取数据时,先是从缓存查找,如果没有,再调用后端接口从其他数据源获取,shiro允许用户使用其他更加现代的企业级数据源来代替内部的默认实现,以提高更高的性能和更好的用户体验。
Cryptography
加密技术,对于一个企业级的安全框架来说,加密算是其固有的一种特性,shiro的Crypto包装包含了一系列的易于理解和使用的加密hash辅助类,所有的类都是经过精心设计,相比于java本身提供的一套反人类的加密组件,shiro的这套加密组件简直好用太多了。
Realm
是连接shiro和安全数据的桥梁,任何时候当shiro需要执行登录或者访问控制的时候,都需要调用已经配置的realm接口去获取数据,一个应用程序可以配置一个或者多个realm,通常来说一个数据源会配置一个。