Shiro的设计目标是简化应用的安全管理工做。软件一般是以用户为基础设计的。也就是说,咱们常常是根据用户是怎样和咱们的软件交互的来设计相关的用户接口。好比,你可能会说“若是是已经登陆的用户与个人软件交互,那么我给他就显示一个按钮,让他点击后能够查看本身的帐户信息。若是用户没有登陆,那么我就显示一个注册按钮”。程序员
这个例子说明了咱们软件中不少代码都是为了知足用户需求而写。即便“用户”有时候压根就不是一我的(好比说另外一个软件系统)。web
Shiro的设计反映了这些思想,这样使得开发者更加容易理解Shiro中的一些概念,也使得Shiro更加易用。算法
1、概览Shiro结构
从高层次来看,Shiro的结构中有三个主要的概念:Subject、SecurityManager和Realms。下图展现了这些组件是如何交互的:数据库

- Subject:指当前正在执行程序的“用户”。Subject含义更广,由于用户一般是指人,而Subject能够指人、进程、计划任务、守护进程等。准确的说,Subject指的是“当前和软件交互的事物”。在多数场景中,你能够将Subject粗暴地认为是用户。
Subject对象都会和一个SecurityManager对象绑定。当你和一个Subject交互时,这些交互行为会被相应的SecurityManager翻译为subject-specific的行为。
- SecurityManager:SecurityManager是Shiro结构中的核心。它用来协调其内部的各类安全组件。然而,一旦SecurityManager和其内部的安全组件配置完成后,程序员就再也不会用到它了,这时候程序员一般是与Subject的API打交道。
咱们将在后序教程中详细介绍SecurityManager。可是在此以前,要知道当咱们与Subject交互时,其实是SecurityManager在幕后帮咱们完成了那些操做,从上面的图中也能够看出这一点。
- Realms:Realms就像一个桥或链接器,将Shiro和你的应用安全数据链接起来。当咱们用安全相关的数据交互时,好比用户帐户的身份验证(登陆)和受权管理,Shiro会从一个或多个配置好的Realms中寻找相关数据。
从这个角度来讲,Realms其实是一个DAO:将链接到数据源的细节封装到内部,而且使Shiro能够轻易地读取相关的数据。当咱们配置Shiro时,必须至少有一个Realms。SecurityManager能够由多个Realms配置,但至少有一个Realms配置。
Shiro提供了多种Realms去链接数据源,如LDAP,数据库(JDBC),文本配置文件(如INI)。
和其余内部组件同样,SecurityManager管理Realms如何获取安全数据和认证数据去配置Subject。
2、详细结构
下图展现了Shiro的详细结构:缓存

- Subject:如上文所述。
- SecurityManager:如上文所述。
- Authenticator(认证器):Authenticator是一个负责执行用户登陆并对此作出相应动做的内部组件。当用户尝试登陆时,逻辑上是Authenticator在执行这个动做。Authenticator知道如何协调一个或多个存储了用户/帐户信息的Realms。从Realms获取的信息被用了认证用户身份。
Authentication Strategy是指当有多个Realms时,若是一个Realms登陆成功了,然而其余的Realms登陆失败了,那么本次登陆是成功的仍是失败的?这由Authentication Stratege决定。
- Authorizer(核准器):Authorizer是一个负责权限控制的组件。和Authenticator相似,Authorizer知道如何协调一个或多个存储了角色和许可的数据源。Authorizer用这些信息决定用户是否容许作某一动做。
- SessionManager(会话管理):SessionManager知道如何建立并管理一个用户Session。这个特性是其余安全管理框架所不具备的。不管任何环境,Shiro均可以在本地管理Session,即便没有web/servlet或EJB容器。SessionDAO能够管理使用何种数据源去实现Session。
- CacheManager(缓存管理):CacheManager建立并管理Cache对象的生命周期。由于Shiro要访问不少底层的数据源进行身份认证、权限管理和Session管理的操做,因此缓存处于最底层用以提升性能。任何开源的缓存框架均可以集成到Shiro中。
- Cryptography (加密):Shiro的crypro包包含了不少易用的加密算法。
- Realms:如前文所述。
3、The SecurityManager
由于Shior鼓励程序员以Subject为中心开发应用,因此程序员几乎不会和SecurityManager打交道。即使如此,深刻地了解一下SecurityManager仍是颇有必要的。安全
如前文所述,SecurityManager处理安全操做、管理全部用户的状态,在Shiro默认的SecurityManager中包括下述功能:框架
- Authentication
- Authoriztion
- Session Managerment
- Cache Managerment
- Realm coordination
- Event propagation(事件传播)
- “记住我”服务
- 建立Subject
- 登出等
为了简化配置而且加强拓展性,Shiro的全部设计都是很是模块化的。如前面详细结构中所叙述的,Shiro将这些复杂的工做设计成了一个又一个模块,而并不是彻底由SecurityManager完成。模块化
SecurityManager还兼容了JavaBeans,这就容许你经过JavaBeans的accessor/mutator(get/set)自定义这些组件,用JavaBeans风格的配置(如Spring、Guice、JBoss)去配置SecurityManager将会很是简单。咱们将在后续教程中作详细介绍。性能