shiro 结构(shiro 第五篇)

SHIRO

Apache Shiro结构

Shiro的设计目的是通过直观和易用的方式来简化‘保护’应用。 shiro的核心模型是应用安全方面是大多数人认为的-->与应用中交互的某个人(某个东西)的上下文。

应用常常基于客户的故事设计,开发者开发根据用户或者api怎么和应用打交道的。比如,你会说:‘如果一个登录的用户和应用交互,我会显示一个按钮给他们,点击后可以看到他们的账号信息。如果没登录, 我会 显示 一个“登陆”按钮’。

这个例子表明应用主要是为了满足用户的需求。甚至‘用户’是另外一系统而不是一个普通人类,你仍然需要体现当前 谁/什么东西 在跟你的应用交互。

Shiro在自己的设计中体现了这些概念。通过匹配对开发者很直观的东西,在任何应用中保持直观和易用性。

高级概述

在最高的概念层面上,shiro结构有三个初级的概念:Subject(主体),SecurityManager(安全管理者),Realm(域,数据视图)。下面的图是高级层面上的概述,它会解释这些组件是怎么交互的,我们将会会提到这些 概念。

 

Subject(主体):我们已经在教程中提到了,这个Sunject实质上是安全领域正在执行用户的‘视图’。经常代表人类,Subject可以是一个人,但它也可以是第三方服务,恶意账号,或者类似的正在和应用交互的任何 东西。

SecurityManager(安全管理器)。他是Shiro结构的‘心脏’并且运行的像个‘雨伞’,协调它内部安全组件形成一个对象图。一旦SecurityManager 和其他对象在应用中配置完后,它就会独自留在家中,开发者的大 部分 时间是花在Subject的api上。

后面我们再细讨论SecurityManager,但是你需要明白你什么时候和Subject交互。他确实是幕后的安全管理器,他承担着所有繁重的操作。这已经体现在上面的基本流程图上了。

Realms(数据视图):它是应用程序安全数据和shiro的‘桥梁’。当需要和安全相关的数据交互,比如拿着用户账号去执行一个登录动作或者授权(访问控制),shiro会通过配置在应用中的R     ealm中寻找。

这意味这realm是安全专用DAO(data access object):他封装了对数据源的连接,让shiro得到关联的数据。当配置shiro时,你至少要指定一个realm去认证/授权。安全管理器可能会配置多个realm,但至少得配置

一个。

Shiro提供开箱即用的realm,可以连接多个安全数据源(比如关系型数据库,aka目录,LDAP,ini等文本格式的配置等等....)。如果默认realm不能满足你的需求,你能插入自定义的realm去呈现你自定义的数据源

像其他内置的组件,安全管理器管理如何使用realm去获取身份数据以表示subject实例。

详细的结构

一下图片是shiro的核心结构概念,然后是对每个结构的简短的总结。

 

Subject : 是用户和第三方应用等和应用交互的实体安全专用视图。

SecurityManager:像上面提到的一样,安全管理器是shiro结构的心脏。它像‘雨伞’管理组件,保证他们顺利的一起工作。它也管理应用每个用户的shiro视图。所以它知道怎么执行每个用户的安全操作。

Authenticator(认证器):它是负责执行和响应每个用户登录操作的组件。当一个用户尝试登录,这个逻辑是被Authent

icator执行的。它知道怎么和一个或多个存储相关用户数据realm交互。数据是从这些realm中得到, realm会验证用户身份。

·Authentication Strategy 认证器的机制

如果配置了对个Realm,这个机制会协调这些realm去确定什么条件下成功或者失败(比如,一个realm认证成功但是另一个是失败的,这样登录是成功?需要所有realm都要成功?第一个成功就可以了?)

Authorizer(访问控制器) Authorizer是应用中负责决定用户访问控制的组件。是最后决定用户是否被允许做什么事情的机制。像Authenticator ,Authorizer也会协调多个数据源去得到角色和权限信息。

Authorizer用这些信息去决定一个用户是否允许执行一个给定的动作。

SessionManager(会话管理器):SessionManager知道如何去创建和管理用户会话生命周期,在任何环境中提供健壮的会话体验。这是在安全领域中是一个独一无二的特征 --shiro在任何环境都能够在本地管理用户会话, 甚至是没有web/servlet 或者EJB的环境中。Shiro默认提供已经存在的session 机制,如果没有session,像一个独立的应用或者没有web环境的应用中,创建一个企业会话提供同样的开发体验。SessionDao 存在 的目 的是存储任何数据源来保持会话。

·SessionDao:

SessionDao代表sessionManager执行session的持久化操作。这使得任何数据都能被插入到sessionManagement中。

CacheManager(存管理器):缓存管理器创建并管理被shiro其他组件使用的cache实例声明周期。因为shiro能够访问多个后端数据源去认证 ,授权和创建会话,所以缓存是框架中一流的提高性能的架构特性。现在的 开源/企业缓存产品都能插入到shiro中 提供快速有效的用户体验。

Crptography(加密):

加密是企业安全框架自带的功能。Shiro的加密包包含对加密易懂和易用的表现形式。散列具有不同的代码实现类。这个包中的所有的方法为了方便和易懂易用都是细心设计的。任何一个用过java自带的加密都知道 这是 个具有挑战性的事情。Shiro的api简化这些复杂的java机制给普通的人类提供易用的加密方式。

Realms(域,数据视图)

像上面说的一样,real是shiro和安全数据之间的桥梁。当他要和其他像用户账号等安全相关的数据交互去执行验证/授权等操作,shrio查找来自一个或多个Realm的东西。你可以根据自己的需要配置一个或多个realm, 并且shiro自己会根据认证/授权的需要协调这些realm。

shiro鼓励以Subject为中心的编程方式,大部分开发者几乎不会和SecurityManager交互(然而框架开发者有时候会发现它是有用的)。虽然如此,SecurityManager的功能还是非常有必要知道的,特别是给一个应用 配 shiro.

 

设计

像上面提到的,SecurityManager执行安全操作并管理应用用户状态。shiro默认的securitymanager中包含

Authentication(验证身份 -登录)

Authorization(授权)

SessionManagement (会话管理)

CacheManagement (缓存管理)

Realm Coordination (域管理)

Event propagation (事件传递)

Remember me service (记住我服务)

subjectc creation (创建subject)

logout and more (退出等等....)

把这么多功能管理在一个单独的组件,让这些事情变得灵活和可以自定义的并且把他们封装到一个实现类中会是非常困难的一件事情。

为了简化配置和得到灵活配置/插拔的能力,shiro实现类实际上都是模块化的设计,SecurityManager实现类其实做的事情并不多,它实际上是轻量级的‘容器组件’,代表着所有嵌入的组件的行为。这种‘包装’方 式设 计在上面的详细架构图中体现出来了。当这些组件运行逻辑时,SecurityManager实现类知道什么时候哪一种方式来协调保证其正常运行。

SecurityManager实现类和组件是Javabeans兼容的,他们可以通过javabean的get/set方法很容易地自定义可插组件。这意味着shiro的架构模块性让自定义行为变得很容易。

由于javabeans的兼容性,SecurityManager很容易就可以支持javabean方式配置的自定义组件整合,像spring,Guice,Jboss等。

我们将介绍配置。

猜你喜欢

转载自blog.csdn.net/weixin_38570967/article/details/80233860