前言
本文具体解析Shiro的配置机制,主要分为如下两部分:编码式配置和INI文件配置。
编码式配置
通过编码方式配置比较简单,但是可重用性低,现实使用中用的不是很多,这边给一个简单示例
//获取Realm对象
Realm realm = ...
//创建SecurityManager对象
SecurityManager securityManager = new DefaultSecurityManager(realm);
//设置组件 如SessionDAO
SessionDAO sessionDAO = new CustomSessionDAO();
((DefaultSessionManager)securityManager.getSessionManager()).setSessionDAO(sessionDAO);
//设置SecurityManager全局获取
SecurityUtils.setSecurityManager(securityManager);
INI文件配置
INI配置可以使用文件的方式进行配置也可以使用代码的方式进行配置,具体如下:
通过INI对象进行配置
这种方式用代码的方式代替配置文件的编写,效果等同。
Ini ini = new Ini();
ini.setSectionProperty(...);
通过Resource配置
这种方式用配置文件进行配置,和Ini效果配置等同。
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
具体部分
[main]
# 此部分用来定义SecurityManager, Realms以及任何需要组成SecurityManager的组件都定义在这个部分
[users]
# 用来定义少量的用户账号
[roles]
# 用来定义少量的角色
[urls]
用来对web应用的url进行过滤配置
下面分别讲解各部分具体的配置:
[main]
案例如下:
[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
# 实例化一个MyRealm并且名字为myRealm
myRealm = com.mamba.MyRealm
# 自定义了两个属性,会被赋值给myRealm对象
myRealm.username = jsmith
myRealm.password = secret
# 引用属性
myRealm.credentialsMatcher = $sha256Matcher
# 嵌套赋值
securityManager.sessionManager.globalSessionTimeout = 1800000
注意:ini配置文件支持数据类型
- 嵌套类型
例子是将securityManager这个对象的嵌套对象sessionManager的globalSessionTimeout变量进行了赋值
securityManager.sessionManager.globalSessionTimeout = 1800000
- 集合
securityManager.sessionManager.sessionListeners = $sessionListener1, $sessionListener2
- map
object1 = com.company.some.Class
object2 = com.company.another.Class
...
anObject = some.class.with.a.Map.property
anObject.mapProperty = key1:$object1, key2:$object2
[users]
正如上面所说的,该部分是用来定义一组静态的用户账号,这适用某些特定账号的定义(例如一些特定权限的账号)。
# 语法: =左边代表的是username(必填),=右边第一个值代表的是密码(必填),往后用,隔开的值代表的是对应的角色(选填)。
[users]
admin = 123
lonestarr = 123, consumer, manager
darkhelmet = 123, consumer, boss
对密码进行加密
需要在main指定加密方式,然后将密码赋值成加密后的值
[main]
...
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
...
iniRealm.credentialsMatcher = $sha256Matcher
...
[users]
# user1 = sha256-hashed-hex-encoded password, role1, role2, ...
user1 = 2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b, role1, role2, ...
[roles]
这部分用来定义具体角色说具有的权限
# 通过*可以代表admin具有所有的权限
admin=*
# 赋予lonestarr这个角色sendInfo权限
lonestarr=sendInfo
# 赋予lonestarr这个角色message下的sendInfo权限(通过:分隔)
lonestarr=message:sendInfo
# 赋予darkhelmet这个角色对id为1和2 message进行sendInfo的权限(实体:权限:实体id) 注意用"包装起来
darkhelmet="message:sendInfo:1,2"
后面在Permission的部分还会详细介绍权限相关的配置
[urls]
这部分主要是针对Web应用,对指定的url进行过滤和拦截。具体会在整合web章节进行详细讲解。
总结
通过本片文章比较直观的了解了Shiro的配置过程,并且配置的主要机制进行了讲解。接下来就是Shiro的核心内容认证和授权,下篇开始会进行详细讲解。