Apache Shiro 配置

Shiro 被设计成能够在任何环境下工作,从最简单的命令行应用程序到最大的企业群集应用。由于环境的多样性,使得许多配置机制适用于它的配置。Shiro的SecurityManager 实现及所支持的组件都是兼容JavaBean的。这使得Shiro几乎能使用任何配置格式,如regular Java,XML(Spring,JBoss, Guice,等等),YAML,JSON,Groovy Builder markup,以及更多的配置。

2.3.1    创建SecurityManager

SecurityManager是Shiro的心脏,主要是做为一个轻量级的“容器”组件,委托计划所有的行为到嵌套的或包含的其他组件。因此应用程序一般都需要配置一个SecurityManager。

创建一个SecurityManger并把它提供给应用程序的绝对的最简单的方法是创建一个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 via static memory:

SecurityUtils.setSecurityManager(securityManager);

 

 

Shiro 的SecurityManager 实现实质上是一个特定安全的嵌套组件中的模块化对象图。因为它们也是兼容JavaBean的,你可以调用任何嵌套组件的getter 和setter 方法来配置SecurityManager以及它的内部对象图。

例如,如果你想配置SecurityManager实例来使用自定义的SessionDAO 来定制Session Management,你可以通过嵌套的SessionManager 的setSessionDAO 方法直接设置SessionDAO:

...
 
DefaultSecurityManager securityManager = new DefaultSecurityManager(realm);
 
SessionDAO sessionDAO = new CustomSessionDAO();
 
((DefaultSessionManager)securityManager.getSessionManager()).setSessionDAO(sessionDAO);
...

 

除了象上述硬编码的方式外也支持文本配置, Shiro 支持INI 格式来构建SecurityManager 对象图及其支持的组件。INI 易于阅读, 易于配置,且设置简单,适合大多数应用程序。

我们能够从一个INI 资源路径创建SecurityManager 实例。我们可以从文件系统,classpath,或分别拥有前缀file:,classpath:,或url:的URL 中获取资源。本例采用Factory 提取classpath 根目录下的shiro.ini 文件并返回SecurityManager实例:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.util.Factory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.config.IniSecurityManagerFactory;
 
...
 
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

如果你需要,INI 配置也可以通过org.apache.shiro.config.Ini 类使用编程方式创建。Ini 类的功能与JDK java.util.Properties 类相似,但通过section 名称,它同时还支持分割。例如:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.util.Factory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.config.Ini;
import org.apache.shiro.config.IniSecurityManagerFactory;
 
...
 
Ini ini = new Ini();
//populate the Ini instance as necessary
...
Factory<SecurityManager> factory = new IniSecurityManagerFactory(ini);
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

 

 

2.3.2    INI配置项

INI基本上是一个文本配置,包含了不同section的键/值对。每个section是唯一命名的,键只是在section中唯一的,而不是在整个配置中(此处与JDK属性不同)。每个section都可以被看作单一属性定义。

注释行是以#号或;号开始。

[main]

配置应用程序的SecurityManager实例及任何它的依赖组件(如Realms)。例如:

[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
 
myRealm = com.company.security.shiro.DatabaseRealm
myRealm.connectionTimeout = 30000
myRealm.username = jsmith
myRealm.password = secret
myRealm.credentialsMatcher = $sha256Matcher
 
securityManager.sessionManager.globalSessionTimeout = 1800000

 

 

简单的原始属性,通过等号来指定。

如果你需要设置的值不是一个原始值,而是另一个对象呢?那么,你可以使用$符号来引用之前定义的实例。

在INI 配置行的等号左侧使用点号,你可以遍历对象图来得到想设置的最终的对象/属性。

对于字节数组值,默认的是使用Base64编码字符串,然而,如果你喜欢使用16 进制编码,你必须在字符串前加上0x前缀。

[users]

允许你定义一组静态的用户帐户。这在大部分拥有少数用户帐户或用户帐户不需要在运行时被动态地创建的环境下是很有用的。

[users]
admin = secret
lonestarr = vespa, goodguy, schwartz
darkhelmet = ludicrousspeed, badguy, schwartz

 

在[users]section 中的每行都必须保证是下面的格式:

username =password, roleName1, roleName2, …, roleNameN

l  在等号左边的值是用户名

l  在等号右边的第一个值是用户的秘密。密码是必须的。

l  任何在密码后用逗号分隔的值都是分配给该用户的角色名。角色名是可选的。

如果你不想[users]section 中密码是纯文本的,你可以使用你喜爱的散列算法(MD5,Sha1,Sha256,等等)来进行加密,并使用生产的字符串作为密码值。默认情况下,密码字符串是16 进制编码,但可以使用Base64 编码代替16进制编码来配置。

一旦你指定了文本密码散列值,你得告诉Shiro 这些都是加密的。你可以通过配置在[main] section 中隐式地创建iniRealm来使用合适的CredentialsMatcher 实现来对应到你所指定的哈希算法:

[roles]

允许你把定义在[users]section 中的角色与权限关联起来。这在大部分拥有少数用户帐户或用户帐户不需要在运行时被动态地创建的环境下是很有用的。例如:

[roles]
# 'admin' role has all permissions, indicated by the wildcard '*'
admin = *
# The 'schwartz' role can do anything (*) with any lightsaber:
schwartz = lightsaber:*
# The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with
# license plate 'eagle5' (instance specific id)
goodguy = winnebago:drive:eagle5

 

在[roles]section 中每个配置行必须定义一个映射以下格式的角色到权限的键/值:rolename =permissionDefinition1, permissionDefinition2, … , permissionDefinitionN

permissionDefinition是一个任意的字符串,但大多数人将会使用符合org.apache.shiro.authz.permission.WildcardPermission格式的字符串,为了易用性和灵活性。

[urls]

在你的应用程序中定义自适应过滤器链来匹配URL 路径。例如:

[urls]
 
/index.html = anon
/user/create = anon
/user/** = authc
/admin/** = authc, roles[administrator]
/rest/** = authc, rest
/remoting/rpc/** = authc, perms["remote:invoke"]

 

等号左边是一个与Web 应用程序上下文根目录相关的Ant 风格的路径表达式。等号右边为过滤器链。

例如,假设你有如下的[urls]行:

/account/** = ssl, authc

此行表明,“任何对应用程序的/account 或任何它的子路径(/account/foo,account/bar/baz,等等)的请求都将触发'ssl,authc'过滤器链”。



你可能感兴趣的:(apache,shiro,ini,groovy,wildcard,permissions)