Apache Shiro系列二:架构


Apache Shiro的设计目标是通过直观易用的方式来简化应用程序的安全开发。Shiro的核心设计模型反映了大多数人思考应用程序安全的方式——即某个人(或某物)与应用程序交互的情境。
软件应用程序通常基于用户故事进行设计。也就是说,你经常会根据用户如何(或应该如何)与软件交互来设计用户界面或服务API。例如,你可能会说:“如果与我的应用程序交互的用户已登录,我会给他们显示一个按钮,点击该按钮可以查看他们的账户信息。如果他们未登录,我将显示一个注册按钮。”
这一示例说明,应用程序在很大程度上是为满足用户的要求和需求而编写的。即使“用户”是另一个软件系统而不是人类,你仍然需要编写代码来反映当前与你的软件交互的对象(或事物)的行为。
Shiro在其设计中体现了这些概念。通过使用软件开发者已经很直观的事物,Apache Shiro几乎可以在任何应用程序中保持直观并且易于使用。

高级概述(High-Level Overview

在最高的概念层次上,Shiro的架构包含三个核心概念:主体Subject)、安全管理器SecurityManager)和领域Realms)。下面的图表是这些组件如何交互的高级概述,我们将在下面分别介绍每个概念:
在这里插入图片描述

  • 主体Subject):主体本质上是特定于当前执行用户的安全“视图”。尽管“用户”一词通常指的是人类,但主体可以是一个人,也可以代表第三方服务、守护进程账户、cron作业或类似的东西——基本上任何正在与软件交互的东西。
    主体实例都与(并需要与)一个安全管理器绑定。当你与主体交互时,这些交互会转化为与安全管理器特定主体的交互。
  • 安全管理器SecurityManager):安全管理器是Shiro架构的核心,充当一种“保护伞”对象,协调其内部形成对象图的安全组件。但是,一旦为应用程序配置了安全管理器及其内部对象图,它通常会被抛诸脑后,应用程序开发人员几乎会将所有时间都花在主体 API上。
    我们将在后面详细讨论安全管理器,但重要的是要意识到,当你与主体进行任何交互时,实际上是背后的安全管理器在执行繁重的主体安全操作。这在上面的基本流程图中有所体现。
  • 领域Realms):领域充当Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当需要与实际的安全相关数据(如用户账户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从应用程序配置的一个或多个领域中查找这些信息。
    从这个意义上说,领域本质上是一个特定于安全的DAO(Data Access Objects):它封装了数据源的连接细节,并在需要时使相关数据对Shiro可用。在配置Shiro时,你必须指定至少一个用于身份验证和/或授权的领域安全管理器可以配置多个领域,但至少需要一个。

详细架构

下图展示了 Shiro 的核心架构概念,以及每个概念的简短总结:
在这里插入图片描述

  • 主体Subject:org.apache.shiro.subject.Subject):特定于当前与软件交互的实体(用户、第三方服务、cron 作业等)的安全“视图”。
  • 安全管理器SecurityManager:org.apache.shiro.mgt.SecurityManager):如上所述,安全管理器是 Shiro 架构的核心。它主要是一个“保护伞”对象,负责协调其管理的组件,以确保它们能够顺畅地协同工作。它还管理每个应用程序用户的Shiro视图,因此它知道如何为每个用户执行安全操作。
  • 认证器Authenticator:org.apache.shiro.authc.Authenticator):认证器是负责执行和响应用户认证(登录)请求的组件。当用户尝试登录时,认证器就会执行相应的逻辑。认证器知道如何与一个或多个存储相关用户/账户信息的领域Realm)进行协调。从这些领域获取的数据将用于验证用户的身份,以确保用户真的是他们自己声称的那个人。
    • 认证策略Authentication Strategy:org.apache.shiro.authc.pam.AuthenticationStrategy):如果配置了多个领域认证策略将协调这些领域,来决定认证请求成功或失败的条件(例如,如果一个领域成功而其他领域失败,认证请求是否成功?是否所有领域都必须成功?还是只需要第一个成功即可?)。
  • 授权器Authorizer:org.apache.shiro.authz.Authorizer):授权器是负责控制用户在应用程序中访问权限的组件。它是最终决定用户是否允许执行某项操作的机制。与认证器类似,授权器也知道如何与多个后端数据源进行协调,以访问角色和权限信息。授权器使用这些信息来准确地决定用户是否允许执行特定的操作。
  • 会话管理器SessionManager:org.apache.shiro.session.mgt.SessionManager):会话管理器知道如何创建和管理用户会话的生命周期,以便在所有环境中为用户提供健壮的会话体验。这是安全框架领域中的一个独特功能——Shiro具有在任何环境中管理用户会话的原生能力,即使在没有Web/Servlet或EJB容器可用的情况下。默认情况下,Shiro将使用可用的现有会话机制(例如Servlet容器),但如果没有可用的会话机制,例如在独立应用程序(standalone application)或非Web环境中,Shiro将使用其内置的企业会话管理来提供相同的编程体验。SessionDAO的存在是为了允许使用任何数据源来持久化会话。
    • 会话数据访问对象SessionDAO,org.apache.shiro.session.mgt.eis.SessionDAO):SessionDAO代表会话管理器执行会话持久化(CRUD)操作。这允许将任何数据存储插入到会话管理基础设施中。
  • 缓存管理器CacheManager:org.apache.shiro.cache.CacheManager):缓存管理器创建并管理其他Shiro组件使用的缓存实例的生命周期。由于Shiro可以访问多个后端数据源进行身份验证、授权和会话管理,因此缓存一直是框架中提高数据源访问性能的一等架构特性。任何现代开源和/或企业缓存产品都可以插入Shiro,以提供快速且高效的用户体验。
  • 加密Cryptography:org.apache.shiro.crypto.*):加密是企业安全框架的自然补充。Shiro的crypto包包含易于使用和理解的加密密码、哈希(也称为摘要)和不同编解码器实现的功能。该包中的所有类都经过精心设计,易于使用和理解。任何使用过Java原生加密支持的人都知道,它就像是一个难以驯服的动物。Shiro的加密API简化了复杂的Java原生加密机制,使加密对于普通人来说易于使用。
  • 领域Realms: org.apache.shiro.realm.Realm):如上所述,领域充当Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当需要与实际的安全相关数据(如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从应用程序配置的一个或多个领域中查找这些信息。你可以根据需要配置尽可能多的领域(通常每个数据源一个),Shiro将在身份验证和授权方面与它们进行必要的协调。

安全管理器(SecurityManager)

由于Shiro的API鼓励以主体为中心的编程方法,因此大多数应用程序开发人员很少会(甚至从未)直接与安全管理器进行交互(不过,框架开发人员有时可能会发现它很有用)。尽管如此,了解安全管理器的工作方式仍然很重要,尤其是在为应用程序配置一个安全管理器时。

设计

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

  • 身份验证 - Authentication
  • 授权 - Authorization
  • 会话管理 - Session Management
  • 缓存管理 - Cache Management
  • 领域协调 - Realm coordination
  • 事件传播 - Event propagation
  • “记住我”服务 - “Remember Me” Services
  • 主体创建 - Subject creation
  • 注销等更多功能 - Logout and more

但是,对一个单独的组件来说,管理这些功能太难了。而且,如果将所有内容都集中在一个实现类中,那么要使这些功能灵活且可自定义将非常困难。
为了简化配置并启用灵活的配置/可插拔性,Shiro的实现都是高度模块化的设计——实际上,安全管理器(SecurityManager)的实现(及其类层次结构)几乎不做任何事情。相反,安全管理器(SecurityManager)的实现主要充当轻量级“容器”组件,将几乎所有操作委托给嵌套/包装的组件。这种“包装器”设计在上面的详细架构图中有所体现。
虽然由嵌套/包装的组件实际执行逻辑,但安全管理器(SecurityManager)的实现知道如何以及何时协调这些组件来执行正确的操作。
安全管理器(SecurityManager)的实现和嵌套/包装的组件符合JavaBeans规范,这允许你(或配置机制)通过标准的JavaBeans访问器/修改器方法(getter/setter)轻松定制可插拔的组件。这意味着Shiro的架构模块化可以转化为非常简单的自定义行为配置。
由于与JavaBeans兼容,因此通过任何支持JavaBeans风格(如Spring、Guice、JBoss等)的机制,使用自定义组件配置安全管理器(SecurityManager)都非常容易。

英文地址:Apache Shiro Architecture

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值