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();
    }
}
相关推荐
启山智软18 小时前
【对比了几家电商商城系统】
java·开源
大尚来也18 小时前
Java 线程池深度解析:ThreadPoolExecutor 七大参数与核心原理
java·python·算法
Mike_66618 小时前
百度云车牌调用识别-Java工程
java·百度云·车牌识别·在线调用
白宇横流学长18 小时前
基于 SpringBoot 的社团活动报名管理系统设计与实现
java·spring boot·后端
子豪-中国机器人18 小时前
python AI自动化
java·前端·python
NE_STOP18 小时前
SpringCloud进阶--Seata与分布式事务
spring
wy31362282119 小时前
Android——组件化实战:Application启动时用ARouter实现跨模块调用
java·前端·spring
旺仔小拳头..19 小时前
请求对象HttpServletRequest与响应对象HttpServletResponse
java
野犬寒鸦19 小时前
从零起步学习AI大模型应用开发 || 第三章:智能体项目实战中的问题与解决方案及思路详解
java·服务器·数据库·人工智能·后端·面试
久绊A19 小时前
服务器磁盘只读/故障排
java·linux·服务器