使用token调用Spring OAuth2 Resource Server接口错误 insufficient_scope

1、场景

最近照着《Spring Security实战》学习,学到第18章,使用Keycloak作为授权服务器,使用

org.springframework.boot:spring-boot-starter-oauth2-resource-server

 实现资源服务器,调用资源服务器的接口返回403,具体错误信息如下:

WWW-Authenticate: Bearer error="insufficient_scope", error_description="The request requires higher privileges than provided by the access token.", error_uri="https://tools.ietf.org/html/rfc6750#section-3.1"

 那就检查scope吧

2、检查scope

2.1 查看access_token(JWK)

到这个网址查看明文的令牌:JSON Web Tokens - jwt.io

看看 scope 都有哪些值。

2.2 资源服务配置

    @Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize
//                        .requestMatchers(HttpMethod.POST, "/workout/").hasAuthority("SCOPE_fitnessapp").requestMatchers(HttpMethod.POST, "/workout/").access(hasScope("fitnessapp")).requestMatchers(HttpMethod.DELETE, "/**").hasAuthority("fitnessadmin").anyRequest().authenticated()).oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));return http.build();}

上一步看到 scope 包含 fitnessapp,那就设置 

access(hasScope("fitnessapp"))

注:实际上资源服务器不设置 scope 也是可以的,因为根本原因不在 scope!!!

3、根本原因以及解决办法

3.1 开启 Spring Security 的日志

在 application.yml 添加配置:

logging:level:org.springframework.security: DEBUG 

再次调用接口,发现这样一段信息:

ExpressionAuthorizationDecision [granted=false, expressionAttribute=#workout.user == authentication.name] 

出问题的代码就是下面这个方法:

@PreAuthorize("#workout.user == authentication.name")
public void saveWorkout(Workout workout) {workoutRepository.save(workout);
}

于是打印看认证后获取的用户名

String name = SecurityContextHolder.getContext().getAuthentication().getName();
System.out.println("###  authentication.name=" + name);

 果然,name不是预期的用户名,而是一段UUID字符串,问DeepSeek这是怎么回事,接着再细看JWK的明文,name 就是token中的 sub 字段的值。

3.2 解决办法

登录Keycloak控制台添加映射器,Client scopes -> fitnessapp -> Mappers

 

 

 

然后重新获取token,看看 sub 字段的值是不是对应的用户名,是的话就没问题了。

最后使用新的token重新调用资源服务器接口,返回200,调用成功!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91328.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4. 观察者模式

目录一、现实应用场景二、初步实现2.1 实现方案12.2 实现方案2三、观察者模式3.1 应用场景3.2 详解3.3 实现3.4 设计类图四、实现五、更多一、现实应用场景 教师的手机号改变之后要通知给所有学生如果有一个学生没有通知到位就会产生遗漏如何自动完成 二、初步实现 2.1 实现…

es 启动中的一些记录

完整修复流程 bash # 1. 创建用户主目录(如果需要) mkdir -p /home/es8 chown es8:es8 /home/es8# 2. 变更 Elasticsearch 目录所有权 chown -R es8:es8 /data/es/elasticsearch-8.17.2/# 3. 调整目录和文件权限 chmod -R 755 /data/es/elasticsearch-8.17.2/ chmod 644 /d…

区块链之拜占庭容错算法——Practical Byzantine Fault Tolerance(PBFT)

实用拜占庭容错算法(PBFT)是由 Barbara Liskov 和 Miguel Castro 于 90 年代末提出的一种共识算法。原论文链接如下: http://pmg.csail.mit.edu/papers/osdi99.pdf pBFT 被设计为在异步(响应请求的时间没有上限)系统…

从电子管到CPU

在线verilog转电路图 简单门电路 https://logic.ly/demo/ 数学基础 普通逻辑 与自然语言关系紧密, 亚里士多德三段论,‌‌穆勒五法 , 语言, 语义,概念,定义,辩论, 诈骗 等, 是文科类的逻辑。 离散数学 不连续数学 数理逻辑 命题逻辑与谓词逻辑, 与数学推理关系紧密, 它…

Javase-8.数组的练习

1.查找数组中指定元素(二分查找)以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较: 如果相等,即找到了返回该元素在数组中的下标 如果小于,以类似方式到数组左半侧查找 如果大于,以…

H3CNE综合实验之机器人

H3CNE综合实验之机器人 实验拓扑图实验需求 1.按照图示配置 IP 地址 2.SW1 和 SW2 之间的直连链路配置链路聚合 3.公司内部业务网段为 Vlan10 和 Vlan20;Vlan10 是市场部,Vlan20 是技术部,要求对 Vlan 进行命名以识别; ​ PC8 属于 Vlan10&#xff0c…

2025/7/15——java学习总结

Java IO、Stream、异常与 File 全体系总结:从基础到进阶的完整突破一、核心知识深耕:四大模块的体系与底层逻辑(一)IO 流:数据传输的基础通道体系架构与核心分类按流向:输入流(InputStream/Read…

【轨物方案】当补贴退潮,光伏电站如何回归价值本质?

中国光伏产业正站在一个历史性的拐点。过去,国家补贴的“黄金时代”催生了装机量的爆发式增长,许多电站在建设初期将重心放在了快速并网,却忽视了贯穿2-30年生命周期的运维规划。如今,补贴浪潮逐渐退去,各大企业开始从…

群晖Nas - Docker(ContainerManager)上安装SVN Server和库权限设置问题

上次安装了Gitlab,可以参考这篇(群晖Nas - Docker(ContainerManager)上安装GitLab),今天来搞SVN服务器,废话不多说。 下载镜像 还是先下载镜像(garethflowers/svn-server&#xff…

前端打包自动压缩为zip--archiver

安装依赖 pnpm add archiver types/archiver/vitePlugins/autoBuildZip.ts import { Plugin } from vite; import archiver from archiver; import fs from fs;const compressFolder (folderPath: string, outputFilePath: string) > {const output fs.createWriteStream(…

React响应式组件范式:从类组件到Hooks

​引言 在UI开发中,"状态变化自动触发UI更新"的响应式机制是构建动态界面的核心。React通过独特的​​单向数据流​​和​​虚拟DOM(Virtual DOM)​​ 实现这一目标,但类组件(Class Components)…

com2tcp工具

com2tcp 是 com0com 套件中的一个实用工具,用于将本地串口(COM)数据转发到 TCP/IP 网络,或者将 TCP/IP 数据转发到本地串口,实现串口数据的网络透传。 1. com2tcp 基本用法 (1)安装 com0com 从…

MySQL实操:将Word表格数据导入MySQL表

文章目录 1. 提出任务1.1 Word表格数据1.2 查看商品空表1.3 任务要求2. 完成任务2.1 借助AI2.1.1 利用AI生成SQL语句2.1.2 在Navicat里执行查询2.1.3 查看商品表记录2.2 借助Excel2.2.1 将Word表格数据复制到Excel2.2.2 新建商品表2.2.3 利用导入向导将电子表格数据导入商品表2…

什么是Podman?能否替代Docker?Podman快速入门

什么是PodmanPodman(POD Manager)是一个开源的无守护进程(daemonless)容器引擎,用于管理容器、容器镜像、容器卷和网络。它兼容 OCI 标准,可以运行 Docker 镜像,并且设计上与 Docker CLI 命令高…

开通保存图片权限

直接粘贴就可以用 上干货 可以的话希望点个start/* 小程序特有相关 */mp-weixin: {appid: VITE_WX_APPID,setting: {urlCheck: false,minified : true //是否压缩js},usingComponents: true,"lazyCodeLoading": "requiredComponents", //按需注入"pe…

【赵渝强老师】大数据交换引擎Sqoop

Sqoop是SQL To Hadoop的简称,它是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(Oracle、MySQL等)间进行数据的传递。通过使用Sqoop可以将一个关系型数据库中的数据导进到Hadoop的HDFS中&#xff0…

C++进阶-map的应用

目录 1.预备知识 2.map的补充知识 2.1map的插入方式 2.2访问键和值 2.3map::operator[]的补充 2.4另外一些map的成员函数的补充 3.map的应用实践-力扣刷题-前k个高频单词 3.1解法1 3.2解法2 3.3解法3 4.map的应用实践-力扣刷题-随机链表的复制 4.1C语言解法 4.2C解…

【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南

目录 一、NeRFStudio安装1.安装(ubuntu系统)2.安装(windows系统) 二、安装tinycudann三、Colmap安装与使用1. 安装依赖2. 安装colmap3.使用colmap3.1 可视化界面使用3.2 Nerfstudio命令行调用Colmap3.3 colmap结果不准时的修复3.4…

Mybatis05-动态sql

一、应用场景MyBatis 的 动态 SQL 是指根据不同的条件动态拼接生成 SQL 语句的能力。它的最大优势是:避免写多个 XML 映射语句、避免 SQL 冗余、提升代码复用性和可维护性。示例1:用户可以通过勾选框,勾选不同的数据进行批量删除,…

VSCODE 选中多行 需要同时按住alt键才可以

在 VS Code 中,如果你发现 必须按住 Alt 键才能选中多行(即“列选择”或“块选择”模式),而直接拖动鼠标无法多选,可能是由于以下原因导致的:1. 检查是否启用了“列选择模式”VS Code 默认情况下&#xff1…