Apache Shiro Architecture 中文说明文档

翻译 ALLEN ⋅ 于 2019-10-21 14:01:24 ⋅ 55 阅读

前言

Apache Shiro 设计的目的是通过直观和易于使用来简化应用程序安全性。Shiro的核心设计模拟了大多数人对应用程序安全性的看法——在与应用程序交互的上下文中。

软件应用程序通常是基于用户故事设计的。也就是说,您将经常基于用户将会(或应该)如何与软件交互来设计用户接口或服务 api 。例如,您可能会说,“如果与我的应用程序交互的用户登录了,我将向他们显示一个按钮,然后他们可以单击该按钮查看他们的帐户信息。如果他们没有登录,我将显示一个注册按钮。”

这个例子表明,编写应用程序主要是为了满足用户需求。即使“用户”是另一个软件系统,而不是人,您仍然需要编写代码来反映当前与您的软件交互的人(或事物)的行为。
Shiro在自己的设计中反映了这些概念。通过匹配对于软件开发人员来说已经直观的东西,Apache Shiro 在任何应用程序中都保持了直观和易于使用。

高级别总览

在最高概念级别中,Shiro 的架构包含 3 个主要概念:Subject,SecurityManager 和 Realms。下面的图片是一张这些组件交互的高级别总览图,并且下面我们会解释每个概念:

file
Subject:正如我们之前提过的,Subject 是一个必要的当前执行用户的具体安全“视图”。“用户”这个词通常是指人类,但 Subject 可以是一个人,也可以代表第 3 方服务,后台账号,定时任务,或者类似的其他事物-基本上正与软件交互的任意事物都行。

Subject 实例都被绑定到(需要)一个 SecurityManager。当与一个 Subject 交互时,这些交互会转换成特定的 subject 与 SecurityManager 的交互。

SecurityManager:SecurityManager 是 Shiro 架构的心脏,作为某种“伞”对象来协调它内部的安全组件。这些组件在一起组成了一张组件对象图。然而,一旦这个 SecurityManager 和它的内部对象图为一个应用进行了配置,那么我们就不用管它们了。之后应用开发者的主要时间是用在使用 Subject API 上了。我们之后会详细讨论 SecurityManager,但是重要的是要意识到当与 Subject 交互时,背后是 SecurityManager 为 Subject 安全操作做了所有的事。这个也反映在了上面的流程图上。

Realms: Realms 作为 Shiro 和 应用程序安全数据的“桥梁”或“连接器”。当 Shiro 需要与实际的安全相关数据比如用户账号交互来执行验证(登录)或授权(访问控制)时,它会从一个或多个 已配置好的Realms 中寻找这些信息。

以这个观念,Realm 是一个必要的特定安全的 DAO:它为数据源封装了连接详情,并使 Shiro 需要的某些数据可用。当配置 Shiro 时,你必须指定至少一个 Realm 来使用验证和/或授权。SecurityManager 可以配有多个 Realms,但至少一个是必须的。

Shiro 提供了开箱即用的 Realms 来连接各种安全数据源(aka目录),比如 LDAP,关系数据库(JDBC),像 INI 和属性文件的文本配置源等等。如果默认 Realms 不能满足你的需要,那么你可以实现自己的 Realm 来表示自定义数据源。

像其他内部组件一样,Shiro SecurityManager 管理着 Realms 如何获取安全和身份数据以表示 Subject 对象。

详细架构

下面这张图展示了 Shiro 核心架构概念,之后对每个概念进行了总结:

file

  • Subject (org.apache.shiro.subject.Subject)
    正与软件交互的实体(用户,第三方服务,定时任务等等)的一个具体安全“视图”。

  • SecurityManager (org.apache.shiro.mgt.SecurityManager)
    正如上面提到的,SecurityManager 是 Shiro 架构的心脏。它像是一个“伞”对象协调着它所管理的组件能平滑地一起工作。它也管理着每个应用程序用户的 Shiro 视图,所以 SecurityManager 知道每个用户如何执行安全操作。

  • Authenticator (org.apache.shiro.authc.Authenticator)
    验证器是负责执行和处理用户验证(登录)的组件。当一用户试图登录,那么登录逻辑由验证器执行。验证器知道如何协调存储了用户/账号信息的一个或多个 Realms 一起工作。从这些 Realms 获得的数据用来校验用户的身份来保证它们所说的用户真正的身份。

  • Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy)
    如果有多个 Realm 配置,那么 AuthenticationStrategy 会协调 Realms 以确定是基于哪个条件使得验证成功或失败(比如,如果某个 realm 成功但是其他失败了,那么这时验证是否成功?还是必须所有的 realms 都要成功?或仅仅只第一个 realm 成功即可?)。

  • 授权器 (org.apache.shiro.authz.Authorizer)
    授权器是负责在应用程序中确定用户访问控制的组件。它是一种告知用户是否被允许或不被允许做某些事情的机制。像验证器,这授权器也知道如何协调多个后端数据源以访问角色和许可信息。授权器使用这些信息来准确地确定一个用户是否允许执行某个给定的动作。

  • Session 管理器 (org.apache.shiro.session.mgt.SessionManager)
    SessionManager 知道如何创建和管理用户 Session 生命周期并在所有环境中为用户提供稳定的 Session 体验。在现存安全框架中,这是一个独一无二的特性 - Shiro 有能力管理在任何环境下的用户 Sessions,即使没有可用的 Web/Servlet 或 EJB 容器。默认情况下,如果可用,Shiro 会使用一个已存在的 session 机制(比如 Servlet 容器),但是如果没有可用的 session 机制,诸如在独立应用或非 web 环境下,Shiro 会使用它内置的企业 session 管理来提供相同的编程经验。SessionDAO 就是允许任何的数据源来使 sessions 持久化。

  • SessionDAO (org.apache.shiro.session.mgt.eis.SessionDAO)
    SessionDAO 代表 SessionManager 执行 Session 持久化(CRUD)操作。这允许任意底层数据存储集成到 Session 管理架构中。

  • CacheManager (org.apache.shiro.cache.CacheManager)
    CacheManager 是创建和管理 其他 Shiro 组件使用的 Cache 实例生命周期。因为 Shiro 可访问许多用于验证,授权和 session 管理的后端数据源, 缓存已经成为一个架构首要的特性来改进使用这些数据源的性能。任何现代开源和/或企业缓存产品可被集成到 Shiro 来提供更快的及有效的用户体验。

  • 加密 (org.apache.shiro.crypto.*)
    对企业的安全框架来说,加密是一个很自然的额外功能。Shiro的crypto包包含易于使用和理解的密码、散列(又名 digests)和不同的编解码器实现的表示形式。 这个包中的所有类都经过精心设计,非常易于使用和理解。任何使用过 Java 本地加密支持的人都知道,它像是一种需要驯服的具有挑战性的动物。Shiro 的 crypto api 简化了复杂的 Java 机制,使密码术易于普通人使用。

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

    SecurityManager

    由于 Shiro 的 API 鼓励以 subject 为中心的编程方法,大多数应用程序开发人员很少(如果有的话)直接与 SecurityManager 交互(不过框架开发人员有时可能会发现它很有用)。即便如此,了解 SecurityManager 的功能仍然很重要,特别是在为应用程序配置 SecurityManager 时。

    设计

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

Authentication
Authorization
Session Management
Cache Management
Realm coordination
Event propagation
“Remember Me” Services
Subject creation
Logout and more.

但是在单个组件中要管理这些功能工程比较大。而且,如果把所有东西都集中到一个实现类中,那么要使这些东西具有灵活性和可定制性就会非常困难。
为了简化配置并支持灵活的配置/可插拔性,Shiro 的实现在设计上都是高度模块化的——如此模块化,以至于 SecurityManager 实现(及其类层次结构)根本不做什么。相反,SecurityManager 实现主要作为一个轻量级的“容器”组件,将几乎所有的行为委托给嵌套/包装组件。这种“包装器”设计反映在上面的详细架构图中。
当组件实际执行逻辑时,SecurityManager 实现知道如何以及何时为正确的行为协调组件。
SecurityManager 实现和这些组件也与 javabean 兼容,这允许您(或配置机制)通过标准 javabean accessor/mutator 方法(get/set)轻松定制可插入组件。这意味着 Shiro 的架构模块化可以转换为非常简单的定制行为配置。
由于 JavaBeans 的兼容性,通过任何支持 javabean 风格配置机制(如Spring、Guice、JBoss等),用定制组件配置SecurityManager非常容易。


原文地址:https://shiro.apache.org/architecture.html...

译文地址:...

追求梦想,做最好的自己

本帖由 ALLEN 于 1个月前 置顶
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
      请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
    Ctrl+Enter