Shiro 使用 INI 配置文件进行安全设置
INI 配置文件结构解析
Shiro 支持通过 INI 格式配置安全相关的组件,适用于快速搭建开发环境或简单应用的安全框架。
1. [main] 区段:定义核心组件与属性
该区段用于声明和配置 Shiro 的核心对象,如认证域、加密匹配器、会话管理器等。
[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
databaseRealm = com.company.security.shiro.DatabaseRealm
databaseRealm.connectionTimeout = 30000
databaseRealm.username = jsmith
databaseRealm.password = secret
databaseRealm.credentialsMatcher = $sha256Matcher
securityManager.sessionManager.globalSessionTimeout = 1800000
- 对象定义:使用 `name = class` 形式创建实例。
- 属性赋值:原始类型直接赋值;引用类型通过 `$+名称` 引用已定义对象。
- 嵌套配置:支持通过点号访问复杂对象的属性(如 `realm.credentialsMatcher`)。
- 默认安全管理者:`securityManager` 是自动识别的默认根对象。
2. 多Realm 组合认证配置示例
[main]
realmOne = cn.javass.hello.MyRealm1
realmTwo = cn.javass.hello.MyRealm2
authenticator = org.apache.shiro.authc.pam.ModularRealmAuthenticator
authenticationStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy
authenticator.authenticationStrategy = $authenticationStrategy
authenticator.realms = $realmOne, $realmTwo
securityManager.authenticator = $authenticator
说明:
- 使用
ModularRealmAuthenticator实现多数据源认证。 - 通过
AllSuccessfulStrategy策略要求所有 Realm 都验证成功。 - 将多个认证域注册到认证器中,并注入至安全管理器。
3. [users] 区段:静态用户账户配置
用于定义固定用户名和密码,通常由 IniRealm 自动加载。
[users]
javass = cc,role1
格式规则:
username = password,role1,role2,...
密码加密存储(十六进制)
若需以哈希形式存储密码,可使用 SHA-256 并转为十六进制字符串:
// Java 示例
String hashed = new Sha256Hash("cc").toHex();
// 输出: 355b1bbfc96725cdce8f4a2708fda310a80e6d13315aec4e5eed2a75fe8032ce
[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
iniRealm.credentialsMatcher = $sha256Matcher
[users]
javass = 355b1bbfc96725cdce8f4a2708fda310a80e6d13315aec4e5eed2a75fe8032ce,role1
密码加密存储(Base64)
也可使用 Base64 编码存储哈希值:
// Java 示例
String base64Hash = new Sha256Hash("cc").toBase64();
// 输出: NVsbv8lnJc3Oj0onCP2jEKgObRMxWuxOXu0qdf6AMs4=
[main]
sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
sha256Matcher.storedCredentialsHexEncoded = false
iniRealm.credentialsMatcher = $sha256Matcher
[users]
javass = NVsbv8lnJc3Oj0onCP2jEKgObRMxWuxOXu0qdf6AMs4=,role1
4. [roles] 区段:角色权限映射
将角色与具体权限关联,支持逗号分隔的权限列表。
[roles]
admin = "system:manage",user:create
manager = "department:view",report:export
格式:
rolename = permission1,permission2,...
权限格式遵循 resource:action 模式,例如:user:create 表示创建用户权限。
5. [urls] 区段(Web 环境专用)
用于 Web 应用中对 URL 路径进行访问控制,需配合 WebFilter 使用,后续章节详述。