了解 Apache Shiro 中的 SecurityManager

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

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

Design

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

  • Authentication

  • Authorization

  • Session Management

  • Cache Management

  • Realm coordination

  • Event propagation

  • “记住我”服务

  • Subject creation

  • Logout
    and more.

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

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

Modularity

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

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

  • 身份验证器(org.apache.shiro.authc.Authenticator)

  • 授权者(org.apache.shiro.authz.Authorizer)

  • SessionManager(org.apache.shiro.session.mgt.SessionManager)

  • CacheManager ( org.apache.shiro.cache.CacheManager )

  • RememberMeManager(org.apache.shiro.mgt.RememberMeManager)

  • SubjectFactory(org.apache.shiro.mgt.SubjectFactory)

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 方法,以完全自定义其行为。

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

  • 它要求您了解并实例化直接实现。如果您不必了解具体的实现以及在哪里找到它们,那就更好了。

  • SecurityUtils.setSecurityManager方法调用使实例化的SecurityManager实例成为 VM 静态单例,这对于许多应用程序而言虽然很好,但如果在同一个 JVM 上运行多个启用 Shiro 的应用程序,则会导致问题。如果实例是应用程序单例,而不是静态内存引用,则可能会更好。

  • 它要求您每次要更改 Shiro 配置时都重新编译应用程序。

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

Text Configuration

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

lendAHandDoc()