Apache Shiro的设计目标是经过直观且易于使用来简化应用程序安全性。Shiro的核心设计模拟了大多数人如何在与某人(或某物)进行交互的状况下如何考虑应用程序安全性。html
软件应用程序一般是根据用户案例设计的。也就是说,您一般会根据用户与软件的交互方式来设计用户界面或服务API。例如,您可能会说:“若是与个人应用程序交互的用户已登陆,我将向他们显示一个按钮,使他们能够单击以查看其账户信息。若是他们没有登陆,我将显示一个注册按钮。”spring
该示例语句代表,编写应用程序主要是为了知足用户需求。即便“用户”是另外一个软件系统而不是人类,您仍然能够编写代码以根据当前正在与您的软件进行交互的人员(或内容)来反映行为。数据库
Shiro在本身的设计中反映了这些概念。经过匹配软件开发人员已经很直观的内容,Apache Shiro仍然保持直观且易于在几乎任何应用程序中使用。apache
在最高概念层次,四郎的建筑有3个主要的概念:Subject
,SecurityManager
和Realms
。下图是这些组件如何交互的高级概述,咱们将在下面介绍每一个概念:编程
Subject
本质上是当前正在执行的用户的安全特定“视图”。“用户”一词一般表示一我的,一我的Subject
能够是一我的,但它也能够表示第三方服务,守护程序账户,cron做业或相似的东西-基本上是当前与该软件交互的任何东西。Subject
实例都绑定到(并要求)SecurityManager
。当您与互动时Subject
,这些互动会转化为与主题相关的互动SecurityManager
。后端
SecurityManager
是Shiro体系结构的核心,并充当一种“伞”对象,该对象协调其内部安全组件,这些安全组件一块儿造成对象图。可是,一旦为应用程序配置了SecurityManager及其内部对象图,一般就不理会它,而且应用程序开发人员几乎全部时间都花在Subject
API上。稍后咱们将SecurityManager
详细讨论,可是重要的是要认识到,当您与进行交互时Subject
,SecurityManager
对于任何Subject
安全操做而言,确实是幕后工做。这反映在上面的基本流程图中。api
从这个意义上说,领域本质上是特定于安全性的DAO:它封装了数据源的链接详细信息,并根据须要使关联数据可用于Shiro。在配置Shiro时,您必须至少指定一个领域用于身份验证和/或受权。所述SecurityManager
可与多个境界被配置,但至少有一个是必需的。缓存
Shiro提供了开箱即用的领域,能够链接到许多安全数据源(又名目录),例如LDAP,关系数据库(JDBC),文本配置源(例如INI和属性文件)等。若是默认的Realms不能知足您的需求,那么您能够插入本身的Realm实现以表示自定义数据源。安全
像其余内部组件同样,ShiroSecurityManager
管理着如何使用领域来获取要表示为Subject
实例的安全性和身份数据。session
下图显示了Shiro的核心架构概念,并简要概述了每一个架构:
org.apache.shiro.subject.Subject
) SecurityManager
是Shiro体系结构的核心。它主要是一个“伞”对象,用于协调其托管组件以确保它们可以顺利协同工做。它还管理Shiro对每一个应用程序用户的视图,所以它知道如何对每一个用户执行安全性操做。认证器(org.apache.shiro.authc.Authenticator)
的Authenticator
是,负责执行和用户反应,以验证(登陆)的尝试的组件。当用户尝试登陆时,该逻辑由执行Authenticator
。该Authenticator
知道如何与一个或多个协调Realms
该商店相关的用户/账户信息。从这些数据中得到的数据Realms
用于验证用户的身份,以确保用户确实是他们所说的真实身份。
Realm
配置了多个身份验证策略,则AuthenticationStrategy
它将协调领域以肯定肯定尝试成功或失败的条件(例如,一个领域成功但其余领域失败) ,尝试是否成功?全部领域都必须成功吗?只有第一个?)。Authorizer
是部件负责肯定用户在该应用程序的访问控制。它是最终代表是否容许用户作某事的机制。像同样Authenticator
,Authorizer
还知道如何与多个后端数据源进行协调以访问角色和权限信息。在Authorizer
使用该信息来准确肯定是否容许用户执行特定的操做。SessionManager(org.apache.shiro.session.mgt.SessionManager)
将SessionManager
知道如何建立和管理用户Session
生命周期,提供在全部环境中的用户强大的会话体验。这是安全框架领域中的一项独特功能-Shiro可以在任何环境中本地管理用户会话,即便没有Web / Servlet或EJB容器也能够。默认状况下,Shiro将使用现有的会话机制(例如Servlet容器)(若是可用),可是若是没有这种机制(例如在独立应用程序或非Web环境中),它将使用其内置的企业会话管理来提供相同的编程经验。的SessionDAO
存在容许任何数据源被用来坚持的会议。
SessionDAO
执行Session
持久代(CRUD)操做SessionManager
。这容许将任何数据存储插入会话管理基础结构。CacheManager
建立和管理Cache
其余四郎组件使用实例的生命周期。由于Shiro能够访问许多后端数据源以进行身份验证,受权和会话管理,因此缓存一直是框架中的一流架构功能,能够在使用这些数据源时提升性能。能够将任何现代的开源和/或企业缓存产品插入Shiro,以提供快速有效的用户体验。crypto
软件包包含易于使用和理解的密码学密码,哈希(又名摘要)和不一样编解码器实现的表示形式。该软件包中的全部类都通过精心设计,以使其易于使用和理解。使用Java的本机加密技术支持的任何人都知道,驯服它多是具备挑战性的动物。Shiro的加密API简化了复杂的Java机制,并使加密技术易于普通凡人使用。Realms
须要配置任意数量(一般每一个数据源一个),而且Shiro会根据须要进行协调,以进行身份验证和受权。SecurityManager
由于Shiro的API鼓励采用以中心为Subject
中心的编程方法,因此大多数应用程序开发人员不多(若是有的话)SecurityManager
直接与之交互(可是框架开发人员有时可能会以为有用)。即便这样,了解这些SecurityManager
功能的功能仍然很重要,尤为是在为应用程序配置功能时。
如前所述,应用程序SecurityManager
执行安全操做并管理_全部_应用程序用户的状态。在Shiro的默认SecurityManager
实现中,这包括:
但这是尝试在单个组件中进行管理的许多功能。并且,若是将全部内容都纳入一个实现类中,那么使这些事情变得灵活和可定制将很是困难。
为了简化配置并实现灵活的配置/可插拔性,Shiro的实如今设计上都是高度模块化的-其实是模块化的,所以SecurityManager实现(及其类层次结构)根本不起做用。相反,这些SecurityManager
实现大多充当轻量级的“容器”组件,几乎将全部行为委派给嵌套/包装的组件。这种“包装”设计反映在上面的详细架构图中。
当组件实际执行逻辑时,SecurityManager
实现知道如何以及什么时候协调组件以实现正确的行为。
的SecurityManager
实现方式和组件也兼容的JavaBeans,它容许(或配置机构),以方便地定制可插组件经由标准的JavaBeans存取器/ mutator方法(获取* /组*)。这意味着Shiro的体系结构模块化能够转化为很是易于配置的自定义行为。
简易配置
因为JavaBeans的兼容性,经过支持JavaBeans风格的配置的任何机制(例如Spring,Guice,JBoss等),使用自定义组件配置SecurityManager都是很是容易的。
接下来咱们将介绍配置。
尽管咱们但愿该文档对您使用Apache Shiro所作的工做有所帮助,但社区一直在不断改进和扩展文档。若是您想帮助Shiro项目,请考虑在须要的地方更正,扩展或添加文档。您提供的每一点帮助都会扩大社区,进而改善Shiro。