SpringSecurity + Jwt权限校验,接口调用403 Forbidden问题排查与解决

news/2024/10/28 14:52:29/

问题背景:部分接口调用正常,部分接口调用报403Forbidden,postman不显示具体报错信息。

在这里插入图片描述

问题描述:

接口调用报错,经排查,权限校验认证通过,可以进入接口,但是在执行过程中,安全上下文丢失,导致返回403异常。相关日志:


2024-10-24 21:07:58.096 [http-nio-8029-exec-6] DEBUG o.s.s.w.a.AnonymousAuthenticationFilter - Set SecurityContextHolder to anonymous SecurityContext
2024-10-24 21:07:58.097 [http-nio-8029-exec-6] DEBUG o.s.s.w.s.HttpSessionRequestCache - Saved request http://xxx:8029/error?continue to session
2024-10-24 21:07:58.097 [http-nio-8029-exec-6] DEBUG o.s.s.w.a.Http403ForbiddenEntryPoint - Pre-authenticated entry point called. Rejecting access

问题出现原因与解决方式:

解决方式

securityConfig中添加以下几行代码就能解决:

@Bean
public SecurityContextRepository securityContextRepository() {return new HttpSessionSecurityContextRepository();
}
出现原因:

方法中使用了CompletableFuture异步方法,异步执行的线程无法获取到原线程的安全上下文,导致权限校验失败。
可能出现这个情况的原因:

  1. 安全上下文的持久化:
    HttpSessionSecurityContextRepository 负责将 SecurityContext 存储在 HTTP 会话中。这意味着每个用户的安全上下文在会话期间是持久化的。
    当请求到达时,Spring Security 会从会话中恢复 SecurityContext,确保用户的认证信息在整个会话期间保持一致。
  2. 异步请求的安全上下文:
    在异步操作中,默认情况下,SecurityContext 可能不会自动传播到新线程中。
    使用 HttpSessionSecurityContextRepository 可以确保在异步请求中,SecurityContext 能够从会话中正确恢复。
  3. 403 错误的原因:
    之前的 403 错误可能是因为在异步操作中,SecurityContext 丢失或未正确设置,导致请求被视为匿名用户。
    通过将 SecurityContext 存储在会话中,Spring Security 能够在每个请求中恢复用户的认证信息,即使是在异步操作中。
    以上结合AI和个人理解给出原因分析,若有不同意见请指正。

问题排查过程:

以下方案都试过了都没用,如果其他人遇到可以试试

  1. 使用 DelegatingSecurityContextAsyncTaskExecutor:(Spring 提供了DelegatingSecurityContextAsyncTaskExecutor,可以在执行异步任务时传递安全上下文。)并在调用方法使用 @Async 注解。

  2. 手动传递 SecurityContext:

public CompletableFuture<RpcResponse<String>> yourMethod() {SecurityContext context = SecurityContextHolder.getContext();return CompletableFuture.supplyAsync(() -> {SecurityContextHolder.setContext(context);try {// 异步执行的代码return rpcService.call();} finally {SecurityContextHolder.clearContext();}});
}
  1. 配置允许匿名访问错误页面:
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/error").permitAll()// 其他路径的权限配置.anyRequest().authenticated().and()// 其他配置
}

http://www.ppmy.cn/news/1542610.html

相关文章

【MySQL】C语言连接MySQL数据库3——事务操作和错误处理API

目录 1.MySQL事务处理机制 1.1.autocommit 1.2.autocommit的设置与查看 1.3.使用示例 2.事务操作API 2.1.设置事务提交模式——mysql_autocommit() 2.2.提交事务——mysql_commit() 2.3.事务回滚——mysql_rollback() 3.错误处理的API 3.1.返回错误的描述——mysql_er…

R语言 | paletteer包:拥有2100多个调色板!

看到 PMID:39024031 文章的代码中&#xff0c;有颜色设置的语句&#xff1a; pal <- paletteer_d("ggsci::category20_d3")[c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)]DimPlot(MM,reduction umap,group.by "sample",label F,pt.size 0.1,c…

小知识点的回顾

1.在正式测试前,对产品或系统的一次简单的验证性测试称为: 验收测试、集成测试、冒烟测试、负载测试(冒烟。不通过就没法测)(验收在软件产品完成了功能和非功能测试后,以用户的角度来验证软件是否满足业务需求和合同规定的要求。集成测试关注模块之间的接口,单元测试后。…

太速科技-217-A(B)-Base Camera link 转光纤传输双向模块

A&#xff08;B&#xff09;-Base Camera link 转光纤传输双向模块 一、板卡概述 本板卡为1路Cameralink图像数据转为1路光纤接口的数据转换板。具备1路Camera-Link&#xff08;BASE&#xff09;图像输入端口&#xff0c; 1路单芯单模光纤通道输出接口。或者1路光纤输入…

Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解

Python Numpy 实现神经网络自动训练&#xff1a;反向传播与激活函数的应用详解 这篇文章介绍了如何使用 Python 的 Numpy 库来实现神经网络的自动训练&#xff0c;重点展示了反向传播算法和激活函数的应用。反向传播是神经网络训练的核心&#xff0c;能够通过计算梯度来优化模…

IDEA初探:深入理解 Structure 功能

一、Structure - 类视图 Structure 是 IDEA 中的一个视图工具&#xff0c;它提供了对当前文件中结构元素的快速访问。通过 Structure&#xff0c;我们可以方便地查看和导航到代码中的各个部分&#xff0c;从而提高代码编辑和浏览的效率。 1.1 基本概念 Structure 视图以树形结…

Python Pandas 数据分析的得力工具:简介

Python Pandas 数据分析的得力工具&#xff1a;简介 在如今的大数据与人工智能时代&#xff0c;数据的收集和处理能力变得至关重要。无论是在科学研究、商业分析还是人工智能领域&#xff0c;如何快速、高效地分析和处理数据都是不可忽视的课题。在众多的数据分析工具中&#…

【PHP】ThinkPHP获取请求的域名及前缀

目录 1. 获取请求的域名 2. 获取请求的完整 URL 3. 获取请求的根 URL 4. 获取请求的前缀 5.示例代码 解释 注意事项 在 ThinkPHP 中&#xff0c;您可以通过 Request 对象来获取请求的域名及前缀。以下是一些常用的方法&#xff1a; 1. 获取请求的域名 $domain $this-…