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();
    }
}
相关推荐
goodlook01233 分钟前
监控平台搭建-日志-springboot直接推送loki篇(九)
java·spring boot·后端·grafana
lfwh3 分钟前
Java 中基于 DBSCAN 算法的车辆交汇点计算实现详解
java·开发语言·算法
独自破碎E25 分钟前
PO、VO、BO、DTO、DAO、POJO有什么区别?
java
czlczl2002092527 分钟前
从 SSO 登录到跨系统资源访问:OAuth2 全链路交互详解
java·spring boot·后端·spring·架构
茶本无香30 分钟前
单例模式深度解析:饿汉式与懒汉式的实现与选择
java·单例模式
爬山算法34 分钟前
Hibernate(29)什么是Hibernate的连接池?
java·后端·hibernate
Fuly102437 分钟前
软件研发类项目流程
java
我命由我1234538 分钟前
Android Jetpack Compose - TopAppBar、BottomAppBar、Scaffold
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
我爱娃哈哈39 分钟前
SpringBoot + Aviator + 规则中心:轻量级表达式引擎实现营销优惠动态计算
java·spring boot·后端