shiro 安全框架入门,看这一篇就够了( 二 )

获取主题后,您可以立即访问当前用户想要使用Shiro进行的所有操作的90%,例如登录,注销,访问其会话,执行授权检查等等-但稍后会介绍更多。
这里的关键是Shiro的API在很大程度上是直观的,因为它反映了开发人员在“每用户”安全控制中进行思考的自然趋势 。
在代码中的任何地方访问主题也很容易,从而可以在需要的地方进行安全操作 。
安全管理器主题的“幕后”对应对象是SecurityManager 。
主题代表当前用户的安全操作,而SecurityManager管理所有用户的安全操作 。它是Shiro体系结构的核心,是一种“伞”对象,它引用了许多内部嵌套的安全组件,这些安全组件构成了一个对象图 。但是,一旦配置了SecurityManager及其内部对象图,通常就不理会它,应用程序开发人员几乎将所有时间都花在Subject API上 。
那么如何设置SecurityManager?
好吧,这取决于您的应用程序环境 。
例如,Web应用程序通常将在web.xml中指定Shiro Servlet过滤器,这将设置SecurityManager实例 。如果您运行的是独立应用程序,则需要以其他方式进行配置 。但是有许多配置选项 。
每个应用程序几乎总是只有一个SecurityManager实例 。
它本质上是一个应用程序单例(尽管不必是静态单例) 。像Shiro中的几乎所有内容一样,默认的SecurityManager实现是POJO,并且可以使用任何与POJO兼容的配置机制-常规Java代码,Spring XML,YAML,.properties和.ini文件等进行配置 。基本上,任何能够实例化类的东西并且可以使用与JavaBeans兼容的调用方法 。
为此,Shiro通过基于文本的INI配置提供了默认的“共母”解决方案 。
INI易于阅读,易于使用,并且几乎不需要依赖项 。您还将看到,通过简单地了解对象图导航,可以有效地使用INI来配置简单的对象图,例如SecurityManager 。
请注意,Shiro还支持Spring XML配置和其他替代方案,但我们将在此处介绍INI 。
下面的清单2中的示例显示了基于INI配置Shiro的最简单示例 。

  • List2 使用 INI 配置
[main]cm = org.apache.shiro.authc.credential.HashedCredentialsMatchercm.hashAlgorithm = SHA-512cm.hashIterations = 1024# Base64 encoding (less text):cm.storedCredentialsHexEncoded = falseiniRealm.credentialsMatcher = $cm[users]jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB在清单2中,我们看到了用于配置SecurityManager实例的INI配置示例 。
INI分为两个部分:[main]和[users] 。
[main]部分是配置SecurityManager对象和/或SecurityManager使用的任何对象(如领域)的地方 。在此示例中,我们看到两个对象被配置:
cm对象,它是Shiro的HashedCredentialsMatcher类的实例 。如您所见,cm实例的各种属性是通过“嵌套点”语法配置的,该语法由清单3所示的IniSecurityManagerFactory用来表示对象图导航和属性设置 。
iniRealm对象,是SecurityManager用来表示以INI格式定义的用户帐户的组件 。
在[用户]部分中,您可以指定用户帐户的静态列表-适用于简单的应用程序或测试时 。
出于本简介的目的,理解每一部分的复杂性并不重要,而是要了解INI配置是配置Shiro的一种简单方法 。
有关INI配置的更多详细信息,请参阅Shiro的文档 。
  • List3 加载配置文件
import org.apache.shiro.SecurityUtils;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.util.Factory;//1. Load the INI configurationFactory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");//2. Create the SecurityManagerSecurityManager securityManager = factory.getInstance();//3. Make it accessibleSecurityUtils.setSecurityManager(securityManager);在清单3中,在这个简单的示例中,我们看到了一个三步过程:
  1. 加载将配置SecurityManager及其组成组件的INI配置 。
  2. 根据配置(使用代表工厂方法设计模式的Shiro的工厂概念)创建SecurityManager实例 。
  3. 使SecurityManager单例可被应用程序访问 。
在这个简单的示例中,我们将其设置为VM静态单例,但这通常不是必需的-您的应用程序配置机制可以确定是否需要使用静态内存 。
Realms(领域)Shiro中的第三个也是最后一个核心概念是领域 。
领域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器” 。


推荐阅读