On this page
了解 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 等)。