Apache Shiro 安全框架入门系列5-Shiro架构详解

Shiro架构详解

— By Solo Cui

Apache Shiro 安全框架入门系列5-Shiro架构详解

1.概述

Apache Shiro的设计目标是通过直观且易于使用来简化应用程序的安全性。Shiro的核心设计模型——也即大多数人对应用安全性思考,就是在相关(某类人或事)背景下与应用的交互。

软件应用程序通常基于用户故事而设计。 也就是说,您经常会根据用户将会(或应该)怎样与软件进行交互来设计用户接口或服务API。 例如,您可能会说:"如果用户与我的应用程序进行登陆后交互,我会向他们显示一个按钮,他们可以点击查看其帐户信息。 如果他们没有登录,我会显示一个注册按钮。"

此示例语句表明应用程序的编写主要是为了满足用户要求和需要。 即使'用户'是另一个软件系统而不是人,但您仍然编写代码来反映基于当前与您的软件进行交互的人(或者什么)的行为。

Shiro以自己的设计反映了这些概念。 也就是匹配软件开发人员已经很直观的东西——Apache Shiro在几乎任何应用程序中都保持直观和易用性。

2.高层视图

在最高的概念层面上,Shiro的架构有三个主要概念:主体,安全管理器和领域。 以下图表就是这些组件如何交互的高层视图或高级总览,下面我们将谈论其中的的每个概念:

Apache Shiro 安全框架入门系列5-Shiro架构详解

•主体(Subject):正如我们在教程中提到的,主体Subject本质上是当前正在执行中的用户的特定安全"视图"。 尽管"用户"一词通常意味着一个人,但一个主体subject可以是一个人,但也可代表第三方服务、守护进程账户,cron作业或类似的任何东西 - 基本上任何当前与该软件进行交互的任何东西。

主体subject实例都绑定到(并且需要)SecurityManager。 当您与主体Subject进行交互时,这些交互会转化为与SecurityManager特定主体进行交互。

•安全管理器(SecurityManager):SecurityManager是Shiro体系结构的核心,充当一种"保护伞"对象,协调其内部安全组件,使它们一起形成一个对象图。 然而一旦为应用程序配置了SecurityManager及其内部对象图,它通常会独立存在的,应用程序开发人员几乎将所有时间都用于Subject API的使用上。

我们稍后将详细讨论SecurityManager,但重要的是要认识到,当您与Subject进行交互时,其实真正的是幕后SecurityManager,它为Subject安全操作做了所有繁重的工作。 这反映在上面的基本流程图中。

领域(Realms):领域充当Shiro和应用程序安全数据之间的"桥梁"或"连接器"。 当需要实际与用户帐户等安全相关数据进行交互时,如执行身份验证(登录)和授权(访问控制),Shiro将从为应用程序配置的一个或多个领域中查找许多这些相关内容。

从这个意义上来说,Realm本质上是一个特定安全的DAO:它封装数据源的连接细节,并根据需要将相关数据提供给Shiro。 配置Shiro时,您必须至少指定一个Realm用于认证和/或授权。 SecurityManager可能配置有多个领域,但至少需要一个。

针对许多安全数据源(又名目录),Shiro提供了开箱即用的Realm连接,如LDAP、关系数据库(JDBC)、文本配置源(如INI和属性文件等)。 如果默认的Realms不能满足您的需求,您可以插入自己的Realm实现来表示自定义数据源。

像其他内部组件一样,Shiro SecurityManager管理如何使用领域获取安全和身份数据以表示为主体Subject实例。

3.详细架构

下图显示了Shiro的核心架构概念,然后是每个概念的简短摘要:

Apache Shiro 安全框架入门系列5-Shiro架构详解

•主题-Subject(org.apache.shiro.subject.Subject)

当前与软件交互的实体(用户,第三方服务,cron作业等)的特定安全"视图"。

•安全管理器-SecurityManager(org.apache.shiro.mgt.SecurityManager)

如上所述,SecurityManager是Shiro架构的核心。 它主要是一个'保护伞'对象,用于协调其托管组件以确保它们一起顺利运行。 它还管理Shiro对每个应用用户的视图,因此它知道如何为每个用户执行安全操作。

•身份验证器(org.apache.shiro.authc.Authenticator)

Authenticator是负责执行和响应用户的认证(登录)尝试的组件。 当用户尝试登录时,该逻辑由Authenticator执行。 认证器知道如何与存储相关用户/账户信息的一个或多个领域协调。 从这些领域获得的数据用于验证用户的身份,以确保用户确实是他们所说的人。

- 身份验证策略(org.apache.shiro.authc.pam.AuthenticationStrategy)

如果配置了多个Realm,则AuthenticationStrategy将协调Realm以确定认证尝试成功或失败的条件(例如,如果一个领域成功但其他失败,则尝试成功与否?是否所有领域都必须成功?还是仅需要第一成功即可?)。

•授权器(org.apache.shiro.authz.Authorizer)

Authorizer是负责确定应用程序中用户访问控制的组件。 这是最终说明用户是否被允许做某事的机制。 与身份验证器一样,授权器Authorizer也知道如何与多个后端数据源协调以访问角色和权限信息。 授权器Authorizer使用此信息来确定是否允许用户执行给定操作。

•会话管理器(org.apache.shiro.session.mgt.SessionManager)

SessionManager知道如何创建和管理用户会话生命周期,以便为所有环境中的用户提供健壮的会话体验。 这是安全框架世界中的一项独特功能 - 即使没有可用的Web/Servlet或EJB容器,Shiro也能够在任何环境中本地管理用户会话。 默认情况下,Shiro将使用现有会话机制(如Servlet容器),但如果没有(例如在独立应用程序或非Web环境中),它将使用其内置的企业会话管理 提供相同的编程经验。 SessionDAO的存在允许任何数据源可用于持久化会话。

- SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)

SessionDAO代表SessionManager执行Session持久性(CRUD)操作。 这允许任意数据存储被插入到会话管理的基础设施中。

•缓存管理器(org.apache.shiro.cache.CacheManager)

CacheManager创建并管理其他Shiro组件使用的Cache实例生命周期。 由于Shiro可以访问许多后端数据源以进行身份验证、授权和会话管理,因此缓存一直是框架中一等的架构特性,可在使用这些数据源时提高性能。 任何现代化的开源和/或企业缓存产品都可以插入到Shiro中,以提供快速和高效的用户体验。

•密码(org.apache.shiro.crypto.*)

密码Cryptography是企业安全框架的自然增补。 Shiro的加密软件包包含易于使用和易于理解的密码、哈希(又名摘要)和不同编解码器的实现。 本包中的所有类都经过精心设计,非常易于使用且易于理解。 任何使用Java本地加密支持的人都知道,驯服它可能是一个挑战性。 Shiro的加密API简化了复杂的Java机制,使密码学易于被普通人使用。

•领域(org.apache.shiro.realm.Realm)

如上所述,Realm充当Shiro和应用程序安全数据之间的"桥梁"或"连接器"。 当需要实际与用户帐户等安全相关数据进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro将从为应用程序配置的一个或多个领域查找这些内容。 您可以根据需要配置尽可能多的领域(通常每个数据源一个),并且Shiro将根据需要与身份验证和授权进行协调。

提示:安全管理器-SecurityManager

由于Shiro的API鼓励以主体为中心的编程方法,因此大多数应用程序开发人员很少会直接与SecurityManager进行交互(但是框架开发人员有时可能会发现它很有用)。 即使如此,了解SecurityManager的功能仍然很重要,尤其是在为应用程序配置一个功能时。

4.Shrio设计

如前所述,应用程序的SecurityManager执行安全操作并为所有应用程序用户管理状态。 在Shiro的默认SecurityManager实现中,包括:

•身份验证

•授权

•会话管理

•高速缓存管理

•领域协调

•事件传播

•"记住我"服务

•主体创建

•注销等。

但是这是一个试图在单个组件中管理的很多功能。 而且,如果所有东西都集中到一个实现类中,要让这些东西变得灵活和可定制将非常困难。

为了简化配置并实现灵活的配置/可插拔性,Shiro的实现在设计中都是高度模块化的——实际上就是模块,而SecurityManager实现(及其类层次结构)实际上并没有做很多。 相反,SecurityManager实现主要作为一个轻量级的"容器"组件,将几乎所有行为委托给嵌套/包装组件。 这个'包装'设计反映在上面的详细架构图中。

当组件实际执行逻辑时,SecurityManager实现知道如何以及何时协调组件的正确行为。

SecurityManager实现和组件也是JavaBeans兼容的,这允许您(或配置机制)通过标准JavaBeans访问器/增量器方法(即get*/set*方法)轻松定制可插入组件。 这意味着Shiro的架构模块化可以为定制行为转化成非常简单的配置。

提示:易配置

由于JavaBeans兼容性,通过支持JavaBeans风格配置的任何机制(例如Spring,Guice,JBoss等),可以很容易地通过自定义组件来配置SecurityManager。

结语

后续我们将介绍Shiro配置的相关内容。理解配置很重要,这样是Shiro的核心黏合机制之所在。相信通过配置的学习,您更能洞悉Shiro框架的原理和机制。有了这些基础准备后,那就是玩转Shiro的项目应用了。请继续关注——点个赞、收藏、转发。^_^


相关推荐