Apache Shiro总体结构

翻译自:http://shiro.apache.org/architecture.html

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

软件应用程序通常是基于用户需求设计的。也就是说,您通常会根据用户如何(或应该)与软件交互设计用户界面或服务api。例如,您可能会说,“如果用户与我的应用程序交互,我将给他们显示一个按钮,他们可以点击查看他们的帐户信息。如果他们没有登录,我将显示一个注册按钮。

这个示例语句表明,应用程序很大程度上是为了满足用户的需要和需求而编写的。即使“用户”是另一个软件系统而不是人,你仍然编写代码来反映基于谁(或什么)正在与你的软件交互的行为。
Shiro在自己的设计中反映了这些概念。通过与软件开发人员的直觉相匹配,Apache Shiro在实际应用中仍然具有直观和易于使用的功能。

高级概述

在最高的概念层次上,Shiro的架构有三个基本概念:主题、安全管理和领域(SubjectSecurityManager and Realms)。下图是这些组件如何交互的高级概览,我们将介绍下面的每个概念:


  • Subject正如我们在教程中提到的,主题基本上是当前执行用户的安全特定“视图”。虽然“用户”这个词通常暗示着一个人,一个主题可以是一个人,但它也可以代表一个第三方服务,守护程序帐户,cron作业,或者任何类似的东西——基本上是任何当前与软件交互的东西。
  • SecurityManager: SecurityManager是Shiro体系结构的核心,它充当的是一种“伞形”对象,协调其内部安全组件,组成一个对象图。但是,一旦SecurityManager和它的内部对象图被配置为应用程序时,通常是单独的,应用程序开发人员几乎所有的时间都用在Subject API上。稍后我们将详细讨论SecurityManager,但重要的是要认识到,当您与一个Subject进行交互时,实际上是幕后的SecurityManager,它为任何主体安全操作执行了所有繁重的任务。这反映在上面的基本流程图中。
  • Realms:Realms充当Shiro和应用程序的安全数据之间的“桥梁”或“连接器”。当需要与安全相关的数据(如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro从一个或多个为应用程序配置的Realms中查找这些东西。
    在这个意义上,一个Realms本质上是一个安全特定的DAO(Data Access Object):它封装了数据源的连接细节,并根据需要将相关数据提供给Shiro。在配置Shiro时,必须指定至少一个用于身份验证和/或授权的Realms。SecurityManager可以配置多个Realms,但至少需要一个。
    Shiro提供了开箱即用的Realms,以连接到一些安全数据源(又名目录),如LDAP、关系数据库(JDBC)、文本配置源(如INI和properties文件)等等。如果默认Realms不满足您的需求,您可以插入自己的Realms实现来表示自定义数据源。
    与其他内部组件一样,Shiro SecurityManager管理如何使用Realms来获取安全性和标识数据,以表示为Subject实例。

详细结构
下图展示了Shiro的核心架构概念,然后是每个以下的简短摘要:

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

The SecurityManager

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

Design(设计)

如前所述,应用程序的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实现和组件也是JavaBeans兼容的,它允许您(或一个配置机制)通过标准javabean accessor/ mutator方法轻松定制可插入组件(get */set *)。这意味着Shiro的体系结构模块化可以转换成非常简单的自定义行为配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值