了解 Apache Shiro 中的 SecurityManager

SecurityManager是 Shiro 架构的核心。 Subject代表单个应用程序用户的安全功能和状态,而SecurityManager则为所有应用程序用户执行安全性操作并 Management 状态。

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

Design

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

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

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

Modularity

为了简化SecurityManager实现的复杂性并允许可插拔的行为,Shiro SecurityManager实现将几乎所有逻辑委托给一组嵌套的模块化组件,这些组件实际执行必要的功能。当组件实际执行逻辑时,SecurityManager实现知道如何以及何时协调组件以实现正确的行为。

SecurityManager坐标和委托给的嵌套组件是:

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

tip('Easy Configuration','由于具有 JavaBeans 兼容性,通过任何支持 JavaBeans 样式的配置的机制(例如 Spring,Guice,JBoss 等),使用自定义组件配置 SecurityManager 非常容易。)

Programmatic Configuration

创建 SecurityManager 并将其提供给应用程序的最简单的绝对方法是创建org.apache.shiro.mgt.DefaultSecurityManager并将其连接到代码中:

Realm realm = //instantiate or acquire a Realm instance.  We'll discuss Realms later. 
SecurityManager securityManager = new DefaultSecurityManager(realm);
//Make the SecurityManager instance available to the entire application: 
SecurityUtils.setSecurityManager(securityManager);

令人惊讶的是,仅需三行代码,您便拥有了适合大多数应用程序的功能齐全的 Shiro 环境。那有多容易!!

您还可以使用上面列出的嵌套组件的自定义实现调用任何SecurityManager实例的 setter 方法,以完全自定义其行为。

但是,就像编程自定义一样简单,这三行代码并不代表大多数实际应用程序的理想配置。程序配置可能不适合您的应用的原因有几个:

相反,大多数应用程序都受益于基于文本的配置,该配置可以独立于源代码进行修改,甚至使那些不熟悉 Shiro API 的人也更容易理解。

Text Configuration

Shiro 提供了一个简单的基于 INI 的configuration,可以直接使用,但也可以使用任何其他与 JavaBeans 兼容的机制。例如,四郎也拥有出色的Spring support。也可以使用其他类似的框架(Guice,JBoss 等)。

lendAHandDoc()

首页