Apache Shiro系列教程之三:Shiro的结构
Shiro的设计目标是简化应用的安全管理工作。软件通常是以用户为基础设计的。也就是说,我们经常是根据用户是怎样和我们的软件交互的来设计相关的用户接口。比如,你可能会说“如果是已经登录的用户与我的软件交互,那么我给他就显示一个按钮,让他点击后可以查看自己的账户信息。如果用户没有登录,那么我就显示一个注册按钮”。
这个例子说明了我们软件中很多代码都是为了满足用户需求而写。即使“用户”有时候压根就不是一个人(比如说另一个软件系统)。
Shiro的设计反映了这些思想,这样使得开发者更加容易理解Shiro中的一些概念,也使得Shiro更加易用。
一、概览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。
二、详细结构
下图展示了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:如前文所述。
三、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将会非常简单。我们将在后续教程中做详细介绍。
Apache Shiro系列教程之三:Shiro的结构的更多相关文章
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- shiro系列五、shiro密码MD5加密
Shiro-密码的MD5加密 1.密码的加密 在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密 ...
- linux虚拟主机管理系统wdcp系列教程之三
我们安装了网站服务管理系统wdcp之后,在使用过程中可能会出现这样或那样的疑问,下面给大家整理几点出来,方便大家学习.还有不懂的可以到wdlinux论坛寻找相关教程. 1.wdcp后台访问安全设置即限 ...
- cocos2d-x游戏开发系列教程-超级玛丽02-代码结构
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 前景回顾 上一篇博文提到超级马里奥的游戏效果,大家 ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)
(本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向 ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统
上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...
- 【前端】CentOS 7 系列教程之三: 搭建 git 服务器
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/linux_3.html 上一篇我们安装好了git,这一篇我们搭建git服务器 创建一个用户组 groupadd g ...
- Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))
off by one(栈)? 将源字符串复制到目标缓冲区可能会导致off by one 1.源字符串长度等于目标缓冲区长度. 当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上 ...
随机推荐
- python 正则表达式总结
一.匹配元字符 使用元字符可以简便操作,写正则表达式时更方便 常用元字符: . 它匹配除了换行字符外的任何字符,在 alternate 模式(re.DOTALL)下它甚至可以匹配换行 ^ 匹配行首. ...
- Django1.9开发博客(7)- 实现功能
到目前为止我们已经完成了一个django应用的所有基础部分. 包括url配置.视图.模型和模板.接下来开始继续完善我们的博客系统了. 首先我们需要一个显示每篇文章的详细页面,对不? 文章详情 对于首页 ...
- leetcode算法思想快速一览
整理了一下思路,想深入了解还得多去写,无奈时间紧迫的情况下抛砖引玉也不失为下策: 1.Two Sum Easy 给出一个数组,找出其中两个和为目标值的坐标.思路: [1]排序. 和为目标值,一般的思路 ...
- ASP.NET MVC 4 RC的JS/CSS打包压缩功能 Scripts.Render和Styles.Render
打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...
- 第十二章 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- css小知识点
1.div如何让背景是透明的 如:<div class="ha"></div> <style> .ha{ background:transpar ...
- Supercell only provide the best games for players
Supercell only provide the best games for players Supercell start to change all, Supercell's first t ...
- iOS开发UI篇—简单的浏览器查看程序
iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...
- 倒计时js代码
<div class="time"> <span id="t_d">00天</span> <span id=" ...
- 获取数据库里面最新的ID
你如果新插入的一段资料,你想获取它的ID,就用 “mysql_insert_id()”; 并且要重新定义一个名称