版本
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的线程非用户会话线程,所以安全上下文中没有认证信息文章来源:https://www.toymoban.com/news/detail-625895.html
解决
在处理消息时将WebsocketSession中保存的认证信息设置到SecurityContext中文章来源地址https://www.toymoban.com/news/detail-625895.html
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();
}
}
到了这里,关于spring websocket 调用受权限保护的方法失败的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!