当前位置: 首页 > news >正文

2. 基于IniRealm的方式

一、使用背景

适用一些小型系统,不必使用数据来实现

1.基于文件存储用户名,密码,角色等信息

二、代码实现

.ini文件

准备一个.ini文件,存储用户信息,并且IniRealm支持权限校验

[users]
admin=admin,超级管理员,运营
[roles]
超级管理员=user:add,user:update,user:delete
.ini文件结构

由多个部分(Section)组成,每个部分都有一个明确的名称,用方括号括起来 [sectionName]

[main]:配置 SecurityManager 及其依赖的组件(如 RealmSessionManager 等)
[users]: 定义静态的用户、密码和角色,用于测试。
[roles]: 定义静态的角色-权限关系。
[urls]: 用于 Web 应用程序,配置 URL 路径的拦截规则

section详解

[main] 部分

  1. 配置的核心,定义 Shiro 的核心对象及其依赖关系
  2. 配置 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
http://www.dtcms.com/a/395909.html

相关文章:

  • 第三十四天:矩阵转置
  • MySQL执行计划:如何发现隐藏的性能瓶颈?
  • embedding多模态模型
  • ⚡ GitHub 热榜速报 | 2025 年 09 月 第 3 周
  • Synchronized的实现原理:深入理解Java线程同步机制
  • 初识C++、其中的引用、类(class)和结构体(struct)
  • Qt之常用控件之QWidget(四)
  • Pod生命周期
  • 【课堂笔记】复变函数-3
  • 深度学习-自然语言处理-序列模型与文本预处理
  • 【C语言】迭代与递归:两种阶乘实现方式的深度分析
  • CLIP多模态模型
  • 快手前端三面(准备一)
  • 前端-JS基础-day1
  • 【开题答辩全过程】以 J2EE在电信行业的应用研究为例,包含答辩的问题和答案
  • C++ QT Json数据的解析
  • RAG——动态护栏
  • Spring Boot 全局鉴权认证简单实现方案
  • 【靶场】webshop渗透攻击
  • 深入浅出现代GPU架构:核心类型、精度模式与选择
  • 开发避坑指南(53):git 命令行标签维护方法
  • javaEE初阶 网络编程(socket初识)
  • 基于Springboot + vue3实现的实验室研究生信息管理系统
  • TwinCat是什么
  • Linux 修炼:进程概念(下)
  • PostgreSQL 全表 count 优化实践:从 SeqScan 痛点分析到 heapam 改进与性能突破
  • 第17讲 机器学习vs神经网络
  • 1. 设计模式--工厂方法模式
  • SpringBoot常用配置
  • 【论文阅读】π0:用于通用机器人控制的视觉-语言-动作流模型