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();
    }
}
相关推荐
好家伙VCC12 小时前
**发散创新:基于Rust的轻量级权限管理库设计与开源许可证实践**在现代分布式系统中,**权限控制(RBAC
java·开发语言·python·rust·开源
m0_7190841112 小时前
天机学堂aaaa
java
孙鹏宇.12 小时前
左值右值.
java·开发语言
XDHCOM13 小时前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
风吹迎面入袖凉13 小时前
【Redis】Redisson分布式锁原理
java·服务器·开发语言
QCzblack13 小时前
BugKu BUUCTF ——Reverse
java·前端·数据库
Orange_sparkle13 小时前
learn claude code学习记录-S02
java·python·学习
李白你好13 小时前
Java GUI-未授权漏洞检测工具
java·开发语言
aq553560013 小时前
四大编程语言对比:PHP、Python、Java、易语言
java·python·php
成为大佬先秃头14 小时前
前后分离项目:整合JWT+Shiro
java·springboot·shiro·jwt