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的结构的更多相关文章

  1. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)

    RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...

  3. shiro系列五、shiro密码MD5加密

    Shiro-密码的MD5加密   1.密码的加密 在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密 ...

  4. linux虚拟主机管理系统wdcp系列教程之三

    我们安装了网站服务管理系统wdcp之后,在使用过程中可能会出现这样或那样的疑问,下面给大家整理几点出来,方便大家学习.还有不懂的可以到wdlinux论坛寻找相关教程. 1.wdcp后台访问安全设置即限 ...

  5. cocos2d-x游戏开发系列教程-超级玛丽02-代码结构

    代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 前景回顾 上一篇博文提到超级马里奥的游戏效果,大家 ...

  6. RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)

    (本教程是使用Net客户端,也就是针对微软技术平台的)   在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向 ...

  7. 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统

    上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...

  8. 【前端】CentOS 7 系列教程之三: 搭建 git 服务器

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/linux_3.html 上一篇我们安装好了git,这一篇我们搭建git服务器 创建一个用户组 groupadd g ...

  9. Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))

    off by one(栈)? 将源字符串复制到目标缓冲区可能会导致off by one 1.源字符串长度等于目标缓冲区长度. 当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上 ...

随机推荐

  1. MongoDB:实体对象(javabean)转DBObject

    代码仅供练习(反射,泛型): package utils; import java.lang.reflect.Field; import com.mongodb.BasicDBObject; impo ...

  2. CSS样式使用

    <html> <head> <style type = "text/css">                          .h{    ...

  3. 在centos中安装jenkins master测试环境

    在centos中安装jenkins   1)安装目录 pwd (/home/AAA)   2)检查java是否安装 [AAA@Centos_AAA jenkins]$ java -version  j ...

  4. 使用CSS3 BACKFACE-VISIBILITY属性制作翻转动画效果

    摘要: 通过backface-visibility:hidden;属性,我们可以使一个元素在翻转之后消失,这是可以使用另一个元素放在它的背面,从而制作出一种元素翻转之后出现另一个元素的效果. ... ...

  5. PHP 扩展开发小结

    1. 变量操作(常量) 设置变量 ZVAL_*系列函数; 例: zval t; ZVAL_STRING(t,"10",2); 获取变量 Z_* 系列函数 获取变量指针 Z_*_P ...

  6. guacamole 0.8.3 项目部署 桌面虚拟化

    Guacamole是一个基于HTML5的虚拟桌面应用程序,其中包含多个组件,由各组件共同构成Guacamole---一个完整的虚拟桌面解决方案,不需要任何插件,只要浏览器支持HTML5就可以实现,而且 ...

  7. hibernate FetchType理解

    JPA定义实体之间的关系有如下几种: @OneToOne @ManyToOne @OneToMany @ManyToMany 在定义它们的时候可以通过fetch属性指定加载方式,有两个值: Fetch ...

  8. 关于ADDED_TO_STAGE事件

    可视类初始化的时候,很多时候要用到stage属性,则要使用Event.ADDED_TO_STAGE事件,这个swf被其它的文件加载,如果直接在初始化函数内使用stage属性 .但是,文档类初始化函数内 ...

  9. Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别

    初接触Hadoop技术的朋友肯定会对它体系下寄生的个个开源项目糊涂了,我敢保证Hive,Pig,HBase这些开源技术会把你搞的有些糊涂,不要紧糊涂的不止你一个,如某个菜鸟的帖子的疑问,when to ...

  10. init.sh 学习(转

    cd /mnt insmod ss_triger_drv.ko insmod ss_led_alarm_drv.ko insmod ss_img_prc_drv.ko insmod ss_post_i ...