[英]How to use Spring Security with Spring Websocket support but without STOMP?
Websocket消息传递会话以Http请求开始,因此可以使用spring安全性,因为它是保护http请求的框架。 在Spring中,经过身份验证的用户及其关联的安全上下文存储在会话中。 可以从Websocket握手访问Authenticated,因为它传输http请求。 Spring Websocket定义了HttpSessionHandshakeInterceptor,它可以使用addInterceptors方法在您的配置中注册
@EnableWebSocket
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry
webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(createHandler(),
"/handler").addInterceptors(new HttpSessionHandshakeInterceptor()
{
@Override
public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
@Nullable Exception ex) {
super.afterHandshake(request, response, wsHandler, ex);
}
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) throws Exception {
boolean b = super.beforeHandshake(request, response,
wsHandler, attributes) &&
((UsernamePasswordAuthenticationToken)
request.getPrincipal()).isAuthenticated();
return b;
}
}).withSockJS();
}
@Bean
public WebSocketHandler createHandler() {
return new MyHandler();
}
}
您还可以在Handler上验证存储在websocket会话中的经过身份验证的使用
我只会添加上面的答案,指定我设法解决它。
我的问题是request.getPrinciple()
返回null
。 从标题的观察中发挥,我发现了cookie
价值。 并且将相同的cookie id
值替换为websocket请求,服务器找到该请求的principle
。
例如,当我们授权时,我向/auth/principal
发出请求,从数据库获取有关玩家的数据。
@GetMapping(value="/auth/principal")
public ResponseEntity principal(HttpServletRequest request,
Principal principal) {
Player player = playerService.findByEmail(principal.getName());
String jsonString = new JSONObject()
.put("id", player.getId())
.put("nickname", player.getNickname())
.put("cookie", request.getHeader("cookie")).toString();
return new ResponseEntity(jsonString, HttpStatus.OK);
}
然后,在客户端,当我想连接到websocket时,我指定请求的标头,定义cookie(cookie:COOKIE-ID)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.