Apache Shiro 架构

Apache Shiro 的设计目标是通过直观且易于使用来简化应用程序安全性。 Shiro 的核心设计模拟了大多数人如何在与某人(或某物)进行交互的情况下如何考虑应用程序安全性。

软件应用程序通常是根据用户案例设计的。也就是说,您通常会根据用户与软件的交互方式来设计用户界面或服务 API。例如,您可能会说:“如果与我的应用程序进行交互的用户已登录,我将向他们显示一个按钮,他们可以单击以查看其帐户信息。如果他们未登录,我将显示一个注册按钮。 ”

该示例语句表明,编写应用程序主要是为了满足用户需求。即使“用户”是另一个软件系统而不是人类,您仍然可以编写代码以根据当前正在与您的软件进行交互的人员(或内容)来反映行为。

Shiro 在自己的设计中反映了这些概念。通过匹配软件开发人员已经很直观的内容,Apache Shiro 仍然保持直观且易于在几乎任何应用程序中使用。

High-Level Overview

在最高概念级别,Shiro 的体系结构具有 3 个主要概念:SubjectSecurityManagerRealms。下图是这些组件如何交互的高级概述,我们将在下面介绍每个概念:

  • 主题 :正如我们在Tutorial中提到的那样,Subject本质上是当前执行用户的特定于安全性的“视图”。 “用户”一词通常表示一个人,而Subject可以是一个人,但它也可以表示第三方服务,守护程序帐户,cron 作业或任何类似的东西-基本上是当前与该软件交互的任何东西。

Subject个实例都绑定到(并需要)SecurityManager。与Subject交互时,这些交互会转换为与SecurityManager的特定于主题的交互。

  • SecurityManagerSecurityManager是 Shiro 体系结构的核心,并充当一种“伞”对象,该对象协调其内部安全组件,一起形成对象图。但是,一旦为应用程序配置了 SecurityManager 及其内部对象图,通常就不理会它,应用程序开发人员几乎将所有时间都花在Subject API 上。

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

  • 领域 :领域充当 Shiro 与您的应用程序安全数据之间的“bridge 梁”或“连接器”。当 true 需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro 会从一个或多个为应用程序配置的领域中查找许多此类内容。

从这个意义上说,领域本质上是特定于安全性的DAO:它封装了数据源的连接详细信息,并根据需要使关联数据可用于 Shiro。在配置 Shiro 时,您必须至少指定一个领域用于身份验证和/或授权。 SecurityManager可以配置有多个领域,但至少需要一个。

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

像其他内部组件一样,Shiro SecurityManagerManagement 如何使用领域来获取要表示为Subject实例的安全性和身份数据。

Detailed Architecture

下图显示了 Shiro 的核心体系结构概念,并简要概述了每个概念:

  • 主题 (org.apache.shiro.subject.Subject)
    当前与软件交互的实体(用户,第三方服务,cron 作业等)的特定于安全性的“视图”。

  • SecurityManager (org.apache.shiro.mgt.SecurityManager)
    如上所述,SecurityManager是 Shiro 架构的核心。它主要是一个“伞”对象,用于协调其托管组件以确保它们能够顺利协同工作。它还 ManagementShiro 对每个应用程序用户的视图,因此它知道如何对每个用户执行安全性操作。

  • 认证者 (org.apache.shiro.authc.Authenticator)
    Authenticator是负责执行用户的身份验证(登录)并对其作出反应的组件。当用户尝试登录时,该逻辑由Authenticator执行。 Authenticator知道如何与一个或多个存储相关用户/帐户信息的Realms进行协调。从这些Realms获得的数据用于验证用户的身份,以确保用户确实是他们所说的真实身份。

  • 认证策略 (org.apache.shiro.authc.pam.AuthenticationStrategy)
    如果配置了多个Realm,则AuthenticationStrategy将协调领域以确定身份验证尝试成功或失败的条件(例如,如果一个领域成功但其他领域失败,则该尝试成功吗?是否所有领域都必须成功?第一?)。

  • 授权人 (org.apache.shiro.authz.Authorizer)
    Authorizer是负责确定应用程序中用户访问控制的组件。它是最终表明是否允许用户做某事的机制。与Authenticator一样,Authorizer也知道如何与多个后端数据源进行协调以访问角色和权限信息。 Authorizer使用此信息来确定是否允许用户执行给定的动作。

  • SessionManager (org.apache.shiro.session.mgt.SessionManager)
    SessionManager知道如何创建和 Management 用户Session的生命周期,以便为所有环境中的用户提供可靠的会话体验。这是安全框架领域中的一项独特功能-Shiro 能够在任何环境中本地 Management 用户会话,即使没有 Web/Servlet 或 EJB 容器也可以。默认情况下,Shiro 将使用现有的会话机制(例如 Servlet 容器)(如果可用),但是如果没有这种机制(例如在独立应用程序或非 Web 环境中),它将使用其内置的企业会话 Management 来提供相同的编程经验。 SessionDAO的存在是为了允许使用任何数据源来保留会话。

  • SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO)
    SessionDAO代表SessionManager执行Session持久性(CRUD)操作。这允许将任何数据存储插入会话 Management 基础结构。

  • CacheManager (org.apache.shiro.cache.CacheManager)
    CacheManager创建和 Management 其他 Shiro 组件使用的Cache实例生命周期。由于 Shiro 可以访问许多后端数据源以进行身份验证,授权和会话 Management,因此缓存一直是框架中的一流架构功能,可以在使用这些数据源时提高性能。可以将任何现代的开源和/或企业缓存产品插入 Shiro,以提供快速有效的用户体验。

  • 密码学 (org.apache.shiro.crypto.*)
    密码术是企业安全框架的自然补充。 Shiro 的crypto软件包包含易于使用和理解的密码学密码,哈希(又名摘要)和不同编解码器实现的表示形式。该软件包中的所有类都经过精心设计,以使其易于使用和理解。使用 Java 的本机加密技术支持的任何人都知道,驯服它可能是具有挑战性的动物。 Shiro 的加密 API 简化了复杂的 Java 机制,并使加密技术易于普通凡人使用。

  • 领域 (org.apache.shiro.realm.Realm)
    如上所述,领域充当 Shiro 与应用程序安全数据之间的“bridge 梁”或“连接器”。当 true 需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro 会从一个或多个为应用程序配置的领域中查找许多此类内容。您可以根据需要配置多个Realms(通常每个数据源一个),并且 Shiro 会根据需要与它们进行协调,以进行身份验证和授权。

The SecurityManager

因为 Shiro 的 API 鼓励以Subject为中心的编程方法,所以大多数应用程序开发人员很少(如果有的话)直接与SecurityManager进行交互(但是框架开发人员有时可能会觉得有用)。即使这样,了解SecurityManager的功能仍然很重要,尤其是在为应用程序配置SecurityManager时。

Design

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

  • Authentication

  • Authorization

  • Session Management

  • Cache Management

  • Realm coordination

  • Event propagation

  • “记住我”服务

  • Subject creation

  • 注销等。

但这是尝试在单个组件中进行 Management 的许多功能。而且,如果将所有内容归为一个实现类,则使这些事情变得灵活和可自定义将是非常困难的。

为了简化配置并实现灵活的配置/可插拔性,Shiro 的实现在设计上都是高度模块化的-实际上是模块化的,因此 SecurityManager 实现(及其类层次结构)根本不起作用。相反,SecurityManager实现主要充当轻量级的“容器”组件,几乎将所有行为委托给嵌套/包装的组件。这种“包装”设计反映在上面的详细 Schema 中。

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

SecurityManager实现和组件也与 JavaBeans 兼容,这使您(或配置机制)可以通过标准 JavaBeans 访问器/更改器方法(get */set *)轻松自定义可插拔组件。这意味着 Shiro 的体系结构模块化可以转化为非常易于配置的自定义行为。

Easy Configuration

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

接下来我们将讨论Configuration

协助处理文档

尽管我们希望该文档对您使用 Apache Shiro 所做的工作有所帮助,但社区一直在不断改进和扩展文档。如果您想为 Shiro 项目提供帮助,请考虑在需要的地方更正,扩展或添加文档。您提供的每一点帮助都会扩大社区,进而改善 Shiro。

提交文档的最简单方法是通过单击下面的Edit链接提交请求请求,然后将其发送到User Forum用户邮件列表