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();
    }
}
相关推荐
历程里程碑14 小时前
C++ 17异常处理:高效捕获与精准修复
java·c语言·开发语言·jvm·c++
雨雨雨雨雨别下啦14 小时前
ssm复习总结
java·开发语言
速易达网络15 小时前
基于Java Servlet的用户登录系统设计与实现
java·前端·mvc
散一世繁华,颠半世琉璃15 小时前
从 0 到 1 优化 Java 系统:方法论 + 工具 + 案例全解析
java·性能优化·操作系统
JasmineWr15 小时前
Java SPI和OSGi
java·开发语言
Lisonseekpan15 小时前
@Autowired 与 @Resource区别解析
java·开发语言·后端
青铜弟弟15 小时前
WOFOST学习笔记4
笔记·python·学习·spring·作物模型·wofost
Gu_yyqx15 小时前
Maven管理工具
java·maven
悦悦子a啊15 小时前
Maven 项目实战入门之--学生管理系统
java·数据库·oracle
晨光321115 小时前
Day34 模块与包的导入
java·前端·python