spring websocket 调用受权限保护的方法失败

版本

spring-security 5.6.10

spring-websocket 5.3.27

现象

通过AbstractWebSocketHandler实现websocket端点处理器

调用使用@PreAuthorize注解的方法报错,无法在SecurityContext中找到认证信息

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException

An Authentication object was not found in the SecurityContext

原因

调用websockethandler的线程非用户会话线程,所以安全上下文中没有认证信息

解决

在处理消息时将WebsocketSession中保存的认证信息设置到SecurityContext中

java 复制代码
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
public class MyWsHandler extends AbstractWebSocketHandler {
	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
		// 在安全上下文中设置认证信息
        SecurityContextHolder.getContext().setAuthentication((Authentication)session.getPrincipal());
        super.handleMessage(session, message);
    }
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 调用受保护的方法
        this.service.doSomething();
    }
}
相关推荐
Drifter_yh2 分钟前
「JVM」 并发编程基石:Java 内存模型(JMM)与 Synchronized 锁升级原理
java·开发语言·jvm
Seven974 分钟前
CompletableFuture深度解析:异步编程与任务编排的实现
java
kyrie学java5 分钟前
SpringBoot搭建项目调试与问题解决
java·spring boot·后端
SimonKing7 分钟前
多数据源:CSV、内存对象可以通过SQL查询,甚至联查,你敢信!
java·后端·程序员
我是Superman丶9 分钟前
Nginx反向代理流式输出延迟?一招解决SSE/WebSocket缓冲问题SpringBoot+SSE流式输出卡住?Nginx这个配置必须关!
运维·websocket·nginx
毕设源码-钟学长13 分钟前
【开题答辩全过程】以 高校疫情管理系统为例,包含答辩的问题和答案
java
cqbzcsq17 分钟前
MC Forge1.20.1 mod开发学习笔记(数据生成、食物)
java·笔记·学习·mc
Hx_Ma1621 分钟前
mybatis练习2
java·数据库·mybatis
山北雨夜漫步21 分钟前
MQ消息队列
java·开发语言