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();
    }
}
相关推荐
Da Da 泓12 分钟前
多线程(七)【线程池】
java·开发语言·线程池·多线程
To Be Clean Coder22 分钟前
【Spring源码】getBean源码实战(三)
java·mysql·spring
Wokoo735 分钟前
开发者AI大模型学习与接入指南
java·人工智能·学习·架构
电摇小人1 小时前
我的“C++之旅”(博客之星主题作文)
java·开发语言
资生算法程序员_畅想家_剑魔1 小时前
Java常见技术分享-23-多线程安全-总结
java·开发语言
萧曵 丶1 小时前
ArrayList 和 HashMap 自动扩容机制详解
java·开发语言·面试
㳺三才人子2 小时前
初探 Spring Framework OncePerRequestFilter
spring boot·spring·junit
这是程序猿2 小时前
基于java的ssm框架学生作业管理系统
java·开发语言·spring boot·spring·学生作业管理系统
千百元2 小时前
限制网段访问服务器端口63790
java·网络·mybatis
宋情写2 小时前
JavaAI03-数据来源
java