编辑推荐: |
本文介绍了Apache Shiro架构详解,包括:高层视图,详细架构,Shrio设计等相关内容。
本文来自于简书,由火龙果软件Anna编辑、推荐。 |
|
Apache Shiro 是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理。借助Shiro易于理解的API,您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的Web和企业应用程序,无所不能。为了能更好的学习和应用此框架,本文主要讲解其架构组成。
Apache Shiro(最新版为1.3.2)的设计目标是通过直观且易于使用方式来简化应用程序的安全性处理。Shiro的核心设计模型,来源于大多数人对应用安全性思考,即在相关(某类人或事)背景下实现与应用的安全性交互。
软件应用程序通常基于用户故事而设计。 也就是说,您经常会根据用户将会(或应该)怎样与软件进行交互来设计用户接口或服务API。
例如,在登录系统描述的场景中,您可能会说:"如果用户与我的应用程序进行登陆后交互,我会向他们显示一个按钮,他们可以点击查看其帐户信息。如果他们没有登录,我会显示一个注册按钮。"
此示例语句表明应用程序的编写主要是为了满足用户要求和需要。 即使“用户”是另一个软件系统而不是人,但您仍然编写代码来反映基于当前与您的软件进行交互的人(或者其它什么)的行为。
Shiro以自己的设计理念反映了这些概念。 换句话说,Shiro安全框架的实现来源真实的应用场景,匹配软件开发人员经常面对且已经很直观的东西,而且Apache
Shiro在几乎任何应用程序中都保持直观和易用性。
接下来,我们从如下三个方面来详细阐述Shiro的架构。
1、高层视图
在最高的概念层面上,Shiro的架构有三个主要概念:主体(Subject),安全管理器(SecurityManager)和领域(Realms)。
以下图表就是这些组件如何交互的高层视图或高级总览,下面我们将谈论其中的的每个概念:
主体(Subject):如上图所示,主体(Subject)本质上是当前正在执行中的用户的特定安全"视图"。
尽管"用户"一词通常意味着一个人,但一个主体Subject可以是一个人,也可代表第三方服务、守护进程账户,cron作业或类似的任何东西
- 基本上任何当前与该软件进行交互的任何东西,都可称称为主体。
主体subject实例都是绑定到(并且需要)SecurityManager(安全管理器)的。 当您与主体Subject进行交互时,这些交互会转化为与SecurityManager特定的主体进行交互,也就是说由SecurityManager代理完成与主体的交互。 安全管理器(SecurityManager):SecurityManager是Shiro体系结构的核心,充当一种"保护伞"式对象,协调其内部安全组件,使它们一起形成一个对象图。
然而,一旦为应用程序配置了SecurityManager及其内部对象图,它通常会独立存在的,应用程序开发人员几乎将所有时间都用于Subject
API的使用上。
我们稍后将详细讨论SecurityManager,但重要的是要认识到,当您与Subject进行交互时,其实真正的是幕后SecurityManager,它为Subject安全操作做了所有繁重的工作。
这反映在上面的基本流程图中。
领域(Realms):领域(Realms)充当Shiro和应用程序安全数据之间的"桥梁"或"连接器"。当需要实际与用户帐户等安全相关数据进行交互时,如执行身份验证(登录)和授权(访问控制),Shiro将从为应用程序配置的一个或多个领域中查找许多这些相关内容。
从这个意义上来说,Realm本质上是一个特定安全的DAO:它封装数据源的连接细节,并根据需要将相关数据提供给Shiro。
配置Shiro时,您必须至少指定一个Realm用于认证和/或授权。SecurityManager可能配置有多个领域,但至少需要一个。
针对许多安全数据源(也有叫目录服务),Shiro提供了开箱即用的Realm连接,如LDAP、关系数据库(JDBC)、文本配置源(如INI和属性文件等)。
如果默认的Realms不能满足您的需求,您可以插入自己的Realm实现来表示自定义数据源。
像其他内部组件一样,Shiro的SecurityManager管理着如何使用领域来获取安全和身份数据,并以之表示为主体Subject实例。
2、详细架构
下图显示了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的功能仍然很重要,尤其是为应用怎么配置以及如何配置某一个功能时。
3、Shrio设计
如前所述,应用程序的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兼容的模式,这允许您(或由配置机制)通过标准JavaBeans访问器/增变器(accessor/mutator)方法(即get*/set*方法)轻松定制可插入组件。
这意味着Shiro的模块化架构可以为定制行为转化成非常简单的配置,也就是定制行为易于配置。
关于定制行为的易配置性,需要知道:
由于与JavaBeans兼容性,通过支持JavaBeans风格配置的任何机制(例如Spring,Guice,JBoss等),可以很容易地通过自定义组件来配置SecurityManager。
通过本文,相信能全面的理解Shiro的总体架构和相应的目标功用,后续我们将更进一步的介绍Shiro的其它相关主题内容。
|