2. 基于IniRealm的方式
一、使用背景
适用一些小型系统,不必使用数据来实现
1.基于文件存储用户名,密码,角色等信息
二、代码实现
.ini文件
准备一个.ini文件,存储用户信息,并且IniRealm支持权限校验
[users]
admin=admin,超级管理员,运营
[roles]
超级管理员=user:add,user:update,user:delete
.ini文件结构
由多个部分(Section)组成,每个部分都有一个明确的名称,用方括号括起来 [sectionName]
[main]:配置 SecurityManager 及其依赖的组件(如 Realm、SessionManager 等)
[users]: 定义静态的用户、密码和角色,用于测试。
[roles]: 定义静态的角色-权限关系。
[urls]: 用于 Web 应用程序,配置 URL 路径的拦截规则
section详解
[main] 部分
- 配置的核心,定义 Shiro 的核心对象及其依赖关系
- 配置 Realm,Realm 是 Shiro 和你的安全数据(如数据库、LDAP)之间的桥梁
[users]
这个部分用于静态地定义用户,格式为:用户名 = 密码, 角色1, 角色2, …
密码默认是明文
角色会在 [roles] 部分定义其权限
[users]
# 用户 'zhang' 密码是 '123', 拥有 'admin' 和 'user' 两个角色
zhang = 123, admin, user
# 用户 'wang' 密码是 '456', 拥有 'user’ 角色
wang = 456, user
# 用户 'li' 密码是 ‘789’, 没有角色
li = 789
[roles] 部分
定义角色与权限的静态映射关系。格式为:角色名 = 权限字符串1, 权限字符串2, …
Shiro 的权限字符串是高度自由的,但通常使用 资源:操作:实例 这种冒号分隔的格式。
[roles]
# ‘admin’ 角色拥有所有权限 (*:*)
admin = *:*# ‘user’ 角色拥有对 ‘product’ 资源的 ‘view’ 和 ‘create’ 操作权限
user = product:view, product:create# ‘operator’ 角色拥有对 ‘order’ 资源的所有操作权限,以及 ID 为 123 的 ‘user’ 资源的 ‘update’ 权限
operator = order:*, user:update:123
package com.simon;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;public class AppTest {@Testpublic void authen(){//1. 构建IniRealmIniRealm realm = new IniRealm("classpath:shiro.ini");//2. 构建SecurityManager绑定RealmDefaultSecurityManager securityManager = new DefaultSecurityManager();securityManager.setRealm(realm);//3. 基于SecurityUtils绑定SecurityManager并声明subjectSecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();//4. 认证操作subject.login(new UsernamePasswordToken("admin","admin"));//5. 角色校验// 超级管理员System.out.println(subject.hasRole("超级管理员"));subject.checkRole("运营");//6. 权限校验System.out.println(subject.isPermitted("user:update"));// 如果没有响应的权限,就抛出异常:UnauthorizedException: Subject does not have permission [user:select]subject.checkPermission("user:delete");}
}
"D:\Program Files\Java\jdk1.8.0_361\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=59261:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit-rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit5-rt.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_361\jre\lib\rt.jar;F:\msb\shiro\target\test-classes;F:\msb\shiro\target\classes;D:\mvn_repository\junit\junit\4.12\junit-4.12.jar;D:\mvn_repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\mvn_repository\org\apache\shiro\shiro-core\1.4.0\shiro-core-1.4.0.jar;D:\mvn_repository\org\apache\shiro\shiro-lang\1.4.0\shiro-lang-1.4.0.jar;D:\mvn_repository\org\slf4j\slf4j-api\1.7.21\slf4j-api-1.7.21.jar;D:\mvn_repository\org\apache\shiro\shiro-cache\1.4.0\shiro-cache-1.4.0.jar;D:\mvn_repository\org\apache\shiro\shiro-crypto-hash\1.4.0\shiro-crypto-hash-1.4.0.jar;D:\mvn_repository\org\apache\shiro\shiro-crypto-core\1.4.0\shiro-crypto-core-1.4.0.jar;D:\mvn_repository\org\apache\shiro\shiro-crypto-cipher\1.4.0\shiro-crypto-cipher-1.4.0.jar;D:\mvn_repository\org\apache\shiro\shiro-config-core\1.4.0\shiro-config-core-1.4.0.jar;D:\mvn_repository\org\apache\shiro\shiro-config-ogdl\1.4.0\shiro-config-ogdl-1.4.0.jar;D:\mvn_repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;D:\mvn_repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\mvn_repository\org\apache\shiro\shiro-event\1.4.0\shiro-event-1.4.0.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.simon.AppTest,authenSLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
true
trueProcess finished with exit code 0