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();
    }
}
相关推荐
愤豆几秒前
10-Java语言核心-JVM原理--字节码与执行引擎详解
java·jvm·python
番茄去哪了3 分钟前
Retrofit框架调用第三方api
java·服务器·retrofit
xuhaoyu_cpp_java8 分钟前
XML学习
xml·java·笔记·学习
爱丽_9 分钟前
AQS 的 CLH 同步队列:入队/出队、park/unpark 与“公平性”从哪来
java·开发语言·jvm
黄昏恋慕黎明10 分钟前
spring的IOC与DI
java·后端·spring
鱼鳞_14 分钟前
Java学习笔记_Day15
java·笔记·学习·排序算法
鹏程十八少21 分钟前
8. Android 深入插件化Shadow源码:揭秘插件Activity启动的完整链路(源码解析)
java·前端·面试
程序员清风22 分钟前
OpenAI创始人学AI的底层逻辑,普通人照着做就能上手!
java·后端·面试
Memory_荒年25 分钟前
Netty面试终极指南:从“Hello World”到源码深处
java·后端
0xDevNull26 分钟前
Java IO流教程:从入门到最佳实践
java·后端