技术开发 频道

安全框架:让Apache Shiro保护你的应用

  下列清单2列出了基于INI的Shiro最简配置:

  清单2. 用INI配置Shiro

[main]
cm
= org.apache.shiro.authc.credential.HashedCredentialsMatcher
cm.hashAlgorithm
= SHA-512
cm.hashIterations
= 1024
# Base64 encoding (less text):
cm.storedCredentialsHexEncoded
= false
iniRealm.credentialsMatcher
= $cm
[users]
jdoe
= TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith
= IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB

  在清单2中,我们看到了用于配置SecurityManager实例的INI配置例子。有两个INI段落:[main]和[users].

  [main]段落是配置SecurityManager对象及其使用的其他任何对象(如Realms)的地方。在示例中,我们看到配置了两个对象:

  cm对象,是Shiro的HashedCredentialsMatcher类实例。如你所见,cm实例的各属性是通过“嵌套点”语法进行配置的 - 在清单3中可以看到IniSecurityManagerFactory使用的惯例,这种方法代表了对象图导航和属性设置。

  iniRealm对象,它被SecurityManager用来表示以INI格式定义的用户帐户。

  [users]段落是指定用户帐户静态列表的地方 - 为简单应用或测试提供了方便。

  就介绍而言,详细了解每个段落的细节并不是重点。相反,看到INI配置是一种配置Shiro的简单方式才是关键。关于INI配置的更多细节,请参见Shiro文档。

  清单3. 装入shiro.ini配置文件

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.Factory;
...
//1.装入INI配置
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2. 创建SecurityManager
SecurityManager securityManager = factory.getInstance();
//3. 使其可访问
SecurityUtils.setSecurityManager(securityManager);

  在清单3的示例中,我们看到有三步:

  装入用来配置SecurityManager及其构成组件的INI配置文件;

  根据配置创建SecurityManager实例(使用Shiro的工厂概念,它表述了工厂方法设计模式);

  使应用可访问SecurityManager Singleton。在这个简单示例中,我们将它设置为VM静态Singleton,但这通常不是必须的 - 你的应用配置机制可以决定你是否需要使用静态存储。

  Realms

  Shiro的第三个也是最后一个概念是Realm。Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当切实与像用户帐户这类安全相关数据进行交互,执行认证(登录)和授权(访问控制)时,Shiro会从应用配置的Realm中查找很多内容。

  从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。

  Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。下面的清单4是通过INI配置Shiro使用LDAP目录作为应用Realm的示例。

1
相关文章