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. block(闭包)

    使用方式 1定义为类的属性 最后用来发布通知,执行block即可 甚至同时发送数据参数,给方法调用者,这样返回数据比返回值形式,更好, 因为这样传参,不是同步的,而是异步响应式的,更加灵活安全. 2定 ...

  2. Django URL传递参数的方法总结(转)

    1 无参数情况 配置URL及其视图如下: 1 2 3 4 (r'^hello/$', hello)   def hello(request): return HttpResponse("He ...

  3. iOS应用之间跳转

    本篇博文将涉及到以下知识点: app应用跳转的原理解析 如何实现两个app应用之间的跳转 如何实现两个app之间跳转到指定界面 二.应用跳转原理 相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫 ...

  4. Android 之 Activity的生命周期

  5. 使用Markdown+Pandoc+LaTex+Beamer制作幻灯片

    概述 为什么使用markdown? mardown是一种轻量级的标记语言,语法简单,可读性好,并且容易转化成其他格式的文档, 在技术文档撰写中得到越来越广泛的应用.相信大家对markdown都有一定了 ...

  6. web项目的日志打印位置设置

    1, 若在项目中放logback.groovy文件(如: src/test/resource下),则日志会打印到控制台上. logback.groovy 内容如下: // // Built on Fr ...

  7. Node.js 路由

    我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码. 因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数.这一功能应当属 ...

  8. 计算机网络(1)-----网络层IP协议概述

    网络层(Network Layer) 概念 网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设 ...

  9. Android Studio的一些快捷键

    以下这些也是百度的其他人整理的.后面有新的会加进来. AS的快捷键容易和QQ,微信等冲突,可以手动关掉或者修改其他软件的热键 Ctrl+G / Ctrl+Alt+Shift+G:查询变量或者函数或者类 ...

  10. MYSQL数据表操作语句

    1.查看某数据库中的表 SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern'] SHOW TABLES列举了给定数据库中的非TEMPORARY表.也可以使 ...