整合Shiro+Jwt
整合Shiro+Jwt大体思路
springboot整合shiro大体上的思路:
1.自定义一个类Realm extends AuthorizingRealm{}
主要是对token授权和认证
重写2个方法
doGetAuthorizationInfo //授权
doGetAuthenticationInfo //认证 认证 代码中手动加上对token校验的判断
2.自定义一个@Configuration类ShiroConfig
ShiroConfig类主要做3个事情
将自定义的Realm注册bean
将realm对象与securityManager对象关联
securityManager.setRealm(realm);
将securityManager对象与ShiroFilterFactoryBean对象关联
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager);
3.整合jwt
先定义公共类JwtUtils
其中定义三个方法 作用分别为token生成 token校验 token是否过期
在realm类的认证doGetAuthenticationInfo方法中调用JwtUtils解析token和登录用户是否满足条件
满足则返回AuthenticationInfo对象 对象中包含profile token name
(只需要定义个profile就好了 profile就是登录的用户信息 可以再定义一个用户实体类 把用户信息放入实体类中那这个对象类就是profile)
边学边整理思路 详细的得边敲边看代码
Shiro整合JWT的两种方式
1.通过URL进行权限控制:
- 配置方式: 在Shiro的配置文件(通常是shiro.ini或shiro-config.xml)中配置URL路径与权限的映射关系。这个配置指定了哪些URL需要哪些权限。
<!-- shiro.ini或shiro-config.xml配置示例 -->
<property name="filterChainDefinitions"><!-- URL路径与权限的映射关系 -->/admin/** = roles[admin], perms["user:delete"]/user/** = authc
</property>
代码示例: 在Java代码中,只需配置Shiro的FilterChainDefinitionMap,将URL路径和权限映射起来。
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/admin/**", "roles[admin]");
filterChainDefinitionMap.put("/user/**", "authc");
特点:
- 静态配置:权限规则在配置文件中静态定义,不易动态改变。
- 适用于简单的权限需求,不需要频繁修改权限规则。
2.通过注解进行权限控制:
- 配置方式: 在需要进行权限控制的Controller类或方法上使用Shiro提供的注解,如
@RequiresRoles
和@RequiresPermissions
。
@Controller
@RequestMapping("/admin")
public class AdminController {@RequiresRoles("admin")@GetMapping("/view")public String adminView() {// 处理业务逻辑return "admin/view";}
}
特点:
- 动态控制:权限规则可以根据方法的注解动态变化,不需要重新配置。
- 精细控制:可以根据方法级别的注解进行更精细的权限控制。
3.配置文件和注解的关系:
- 在项目中,通常会将基本的URL路径与权限的映射关系配置在配置文件中,这些是项目的基础权限。然后,通过注解在Controller中进行更精细的权限控制,例如,限制某个Controller的某个方法需要特定的角色或权限。
<!-- shiro.ini或shiro-config.xml配置示例 -->
<property name="filterChainDefinitions"><!-- URL路径与基本权限的映射关系 -->/admin/** = roles[admin], perms["user:delete"]/user/** = authc
</property>
@Controller
@RequestMapping("/admin")
public class AdminController {@RequiresRoles("admin")@GetMapping("/view")public String adminView() {// 处理业务逻辑return "admin/view";}
}
-
这种组合方式可以实现项目中灵活的权限控制,基本权限由配置文件定义,而特殊权限由注解在代码中控制,使得权限管理更加清晰和可维护。
通过这种组合方式,您可以在项目中实现动态和精细的权限管理,同时保持基本权限的静态配置,以适应不同的权限需求。
对比说明
1. 通过URL进行权限控制:
首先,配置Shiro的过滤器和URL拦截规则,然后在控制器中添加注解。
Shiro配置文件 (shiro.ini 或 shiro-config.xml):
<!-- 配置JWTFilter,用于处理JWT的生成、解析和验证 -->
<bean id="jwtFilter" class="com.example.JWTFilter"></bean><!-- 配置Shiro过滤器链 -->
<filter-mappings><filter-name>jwtFilter</filter-name><url-pattern>/api/**</url-pattern>
</filter-mappings>
控制器 (AdminController.java):
@Controller
@RequestMapping("/admin")
public class AdminController {// 需要admin:view权限才能访问@GetMapping("/view")public String view() {return "admin/view";}// 其他业务方法
}
2. 通过注解进行权限控制:
在控制器方法上添加Shiro的注解来声明需要的角色或权限。
控制器 (AdminController.java):
@Controller
@RequestMapping("/admin")
public class AdminController {@RequiresPermissions("admin:view") // 使用注解声明需要admin:view权限@GetMapping("/view")public String view() {return "admin/view";}// 其他业务方法
}
上述代码演示了通过URL控制和通过注解控制权限的两种方式。通过URL控制更加基于URL模式,适用于相对简单的权限需求,可以在配置文件中进行集中管理。通过注解控制更加直观,能够明确指定每个方法的权限要求,适用于需要细粒度控制的情况。
合二为一:
Shiro配置文件 (shiro.ini 或 shiro-config.xml):
<!-- 配置JWTFilter,用于处理JWT的生成、解析和验证 -->
<bean id="jwtFilter" class="com.example.JWTFilter"></bean><!-- 配置Shiro过滤器链 -->
<filter-mappings><filter-name>jwtFilter</filter-name><url-pattern>/api/**</url-pattern>
</filter-mappings>
控制器 (AdminController.java):(注意两种方式代码基本一致,只是注释有区别)
@Controller
@RequestMapping("/admin")
public class AdminController {@RequiresPermissions("admin:view") // 使用注解声明需要admin:view权限@GetMapping("/view")public String view() {return "admin/view";}// 其他业务方法,例如编辑管理员信息,需要admin:edit权限@RequiresPermissions("admin:edit")@GetMapping("/edit")public String edit() {return "admin/edit";}// 删除管理员,需要admin:delete权限@RequiresPermissions("admin:delete")@GetMapping("/delete")public String delete() {return "admin/delete";}// 其他业务方法
}
在上述示例中,我们添加了更多的业务方法,如编辑管理员信息和删除管理员,并使用Shiro的@RequiresPermissions
注解明确指定每个方法需要的权限要求。例如,edit
方法需要admin:edit
权限,delete
方法需要admin:delete
权限。
相关文章:
整合Shiro+Jwt
整合ShiroJwt大体思路 springboot整合shiro大体上的思路: 1.自定义一个类Realm extends AuthorizingRealm{} 主要是对token授权和认证 重写2个方法 doGetAuthorizationInfo //授权 doGetAuthenticationInfo //认证 认证 代码中手动加上对token校验的判断2.自…...
Python 图形化界面基础篇:创建工具栏
Python 图形化界面基础篇:创建工具栏 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建工具栏步骤4:向工具栏添加工具按钮步骤5:处理工具按钮的点击事件步骤6:启动…...
基于matlab实现的卡尔曼滤波匀加速直线运动仿真
完整程序: clear clc %% 初始化参数 delta_t 0.1; %采样时间 T 8; %总运行时长 t 0:delta_t:T; %时间序列 N length(t); %序列的长度 x0 0; %初始位置 u0 0; %初速度 U 10; %控制量、加速度 F [1 delta_t 0 1]; %状态转移矩阵 B …...
windows Visual Studio 2022 opengl开发环境配置
1. 安装glew(GL), GLFW, glm, soil2-debug 还需要premake生成visual studio solution cmake for windows也要安装一个, 但是不用安装MinGW64, bug多 下载源码,找到xxx.sln文件用visual stidio打开solution编译代码,找到xxx.lib, xxx.dll文件…...
中国财政科学研究院党委书记、院长刘尚希一行莅临麒麟信安调研
为贯彻落实省委第十二届四次全会精神,加快推动湖南高质量发展,9月16日下午,由中国财政科学研究院党委书记、院长刘尚希,中国电子信息产业发展研究院总工程师秦海林,省委改革办副主任梁仲,省发展改革委党组成…...
基于element-ui的年份范围选择器
基于element-ui的年份范围选择器 element-ui官方只有日期范围和月份范围选择器,根据需求场景需要,支持年份选择器,原本使用两个分开的年份选择器实现的,但是往往有些是不能接受的。在网上找了很多都没有合适的,所以打…...
【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。
您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。详情查看:http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的,点击以后就进入…...
JS操作数组方法学习系列(1)
目录 数组添加元素 (push)数组移除末尾元素 (pop)数组添加元素到开头 (unshift)数组移除开头元素 (shift)数组查找元素索引 (indexOf)数组反向查找元素索引 (lastIndexOf)数组切割 (slice)数组连接 (concat)数组元素查找 (find 和 findIndex)数组元素过滤 (filter)数组元素映射…...
翻牌闯关游戏
翻牌闯关游戏 3关:关卡由少至多12格、20格、30格图案:12个玩法:点击两张卡牌,图案一到即可消除掉 记忆时长(毫秒):memoryDurationTime:5000 可配置:默认5000 提示游戏玩法:showTipsFlag:1 可…...
CilckHouse创建表
一、引擎 一开始没注意有引擎选择,要用什么引擎去官方文档看看自己建的表适合什么引擎,大部分用MergeTree 二、用sql语句生成表 1、MergeTree引擎 原文地址:https://blog.csdn.net/qq_21383435/article/details/122812921?ops_request_misc%…...
高级运维学习(八)Ceph 概述与部署
ceph概述 ceph可以实现的存储方式: 块存储:提供像普通硬盘一样的存储,为使用者提供“硬盘”文件系统存储:类似于NFS的共享方式,为使用者提供共享文件夹对象存储:像百度云盘一样,需要使用单独的客…...
【图像处理】VS编译opencv源码,并调用编译生成的库
背景 有些时候我们需要修改opencv相关源码, 这里介绍怎么编译修改并调用修改后的库文件。 步骤 1、下载相关源码工具: 下载opencv4.8源码并解压 https://down.chinaz.com/soft/40730.htm 下载VS2019,社区版免费 https://visualstudio.micro…...
STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案
第 1 章 概述 技术特点 支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出(RJ45 接口),支持多组动态 PDO 分组和对象字典的自动映射,支持站 号 ID 的自动设置与保存,支持 SDO 的…...
Postman应用——测试脚本Test Script
文章目录 Test Script脚本CollectionFolderRequest 解析响应体断言测试 测试脚本可以在Collection、Folder和Request的Pre-request script 和 Test script中编写,测试脚本可以检测请求响应的各个方面,包括正文、状态代码、头、cookie、响应时间等&#x…...
JS的网络状态以及强网弱网详解
文章目录 1. online 和 offline 事件2. navigator.onLine2.1 什么是 navigator.connection?2.2 如何使用 navigator.connection?2.3 总结 1. online 和 offline 事件 online 和 offline 事件是浏览器自带的两个事件,可以通过添加事件监听器来…...
大数据-kafka学习笔记
Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka可以用作Flink应用程序的数据源。Flink可以轻松地从一个或多个Kafka主题中消费数据流。这意味着您可以使用Kafka来捕获和传输…...
详述RPA项目管理流程,RPA项目管理流程是什么?
RPA(Robotic Process Automation,机器人流程自动化)是一种通过软件机器人模拟人类在计算机上执行重复性任务的技术。RPA可以帮助企业提高工作效率、降低成本、减少错误并提高客户满意度。然而,为了确保RPA项目的成功实施ÿ…...
爬虫 — Js 逆向
目录 一、概念1、爬虫2、反爬虫3、加密解密4、加密5、步骤 二、常用加密方式1、加密方式2、常见加密算法3、JS 中常见的算法4、MD5 算法4.1、MD5 加密网站4.2、特点 5、DES/AES 算法6、RSA 算法7、base64 算法 三、环境配置1、node.js 环境配置2、PyCharm 环境配置 一、概念 1…...
Python 网络爬取的时候使用那种框架
尽管现代的网站多采取前后端分离的方式进行开发了,但是对直接 API 的调用我们通常会有 token 的限制和可以调用频率的限制。 因此,在一些特定的网站上,我们可能还是需要使用网络爬虫的方式获得已经返回的 JSON 数据结构,甚至是处理…...
CentOS7安装源设置
此处的安装源地址需要填写:(适用于centos7) http://mirrors.aliyun.com/centos/7/os/x86_64/...
pool = multiprocessing.Pool()报错:module object has no attribute Pool
pool multiprocessing.Pool()报错:module object has no attribute Pool,为什么? 我很抱歉,前面提供的回答是错误的。在Python的multiprocessing模块中,确实有一个名为Pool的类。如果你在使用multiprocessing.Pool()…...
Linux Shell 实现一键部署podman
podman 介绍 使用 Podman 管理容器、Pod 和映像。从本地环境中无缝使用容器和 Kubernetes,Podman 提供与 Docker 非常相似的功能,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。 Podman 可以管理和运行…...
Biome-BGC生态系统模型与Python融合技术
Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数,模拟日尺度碳、水和氮通量的有效模型,其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天…...
Matlab图像处理-区域描述
一旦一幅图像的目标区域被确定,我们往往用一套描述子来表示其特性。选择区域描述子的动机不单纯为了减少在区域中原始数据的数量,而且也应有利于区别带有不同特性的区域。因此,当目标区域有大小、旋转、平移等方面的变化时,针对这…...
openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据
文章目录 openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据 openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新…...
Flink RowData 与 Row 相互转化工具类
RowData与Row区别 (0)都代表了一条记录。都可以设置RowKind,和列数量Aritry。 (1)RowData 属于Table API,而Row属于Stream API (2)RowData 属于Table内部接口,对用户不友…...
企业架构LNMP学习笔记48
数据结构类型操作: 数据结构:存储数据的方式 数据类型 算法:取数据的方式,代码就把数据进行组合,计算、存储、取出。 排序算法:冒泡排序、堆排序 二分。 key: key的命名规则不同于一般语言…...
docker部署neo4j
拉取镜像 docker pull neo4j:3.5.35-community查看镜像 [rootlocalhost data]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE neo4j 3.5.35-community 3548ff943256 13 months ago 446MB创建容器并运行 docker run -d …...
融云观察:AI Agent 是不是游戏赛道的下一个「赛点」?
本周四 融云直播间,点击报名~ ChatGPT 的出现,不仅让会话成为了未来商业的基本形态,也把大家谈论 AI 的语境从科技产业转向了 AI 与全产业的整合。 关注【融云全球互联网通信云】了解更多 而目前最热衷于拥抱生成式 AI 的行业中,…...
运用谷歌浏览器的开发者工具,模拟搜索引擎蜘蛛抓取网页
第一步:按压键盘上的F12键打开开发这工具,并点击右上角三个小黑点 第二步:选择More tools 第三步:选择Network conditions 第四步:找到User agent一列,取消复选框的勾选 第五步:选择谷歌爬虫…...
做网站怎么引用字体/整站优化要多少钱
我们都知道,序列化不会自动保存static和transient变量,因此我们若要保存它们,则需要通过writeObject()和readObject()去手动读写。(01) 通过writeObject()方法,写入要保存的变量。writeObject的原始定义是在ObjectOutputStream.ja…...
长春网站制作价格/百度搜索引擎盘搜搜
为什么80%的码农都做不了架构师?>>> IT技术潮流从来没有想今天这般风云变幻,城头变幻大王旗。对于科技人才来说,这是最好的时代,也是最坏的时代。新技能和工具的不断涌现对个人的学习能力是个极大的挑战,同…...
便宜营销型网站建设优化建站/企业网站首页
eclipse界面定制,让eclipse看着更清爽转载于:https://www.cnblogs.com/passer1991/p/3227755.html...
网站源码怎么获取/武汉seo网站管理
这篇将讲到图片特效处理的图片光晕效果。跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之六…...
wordpress html编辑器插件/seo网站推广经理招聘
写在前面作为理工科出身的直男,不仅仅自己喜欢折腾一些科技数码产品,在培养孩子的过程中似乎也潜移默化的影响。所以再给孩子购买玩具时总是喜欢和科技沾上一点边,所以妈妈总是觉得买的玩具不是给孩子的,而是给我自己的。不过现在…...
常州模板网站建设咨询/成都最新热门事件
//js 库代码: //ZAJ.js库代码 (function (){ //注册命名空间 AZJ 到window对象上 window[AZJ] {} //getElementsByClassName包含两个参数:类名,标签名 function getEleme…...