Fen*_*cer 6 java security spring websocket sockjs
我目前正在构建一个使用 Spring 来利用 websocket 支持和安全性的 Web 应用程序。问题是,我不想使用 STOMP。现在已经有大约 4 个版本没有更新了,我不需要它。因此,我按照另一个 Stackoverflow问题的答案,使用 SockJS 但不使用 STOMP 为 Websocket 配置 Spring。
现在我想集成 Spring Security 来进行 websocket 身份验证和授权。不幸的是,该文档必须为 STOMP-websockets 配置 Spring Security。
我非常感谢任何为我的案例配置 Spring Security 的帮助。有人知道这方面的教程或示例吗?我还没有找到。
小智 3
Websocket 消息会话以 Http 请求开始,因此可以使用 spring security,因为它是保护 http 请求的框架。在 Spring Security 中,经过身份验证的用户及其关联的安全上下文存储在会话中。可以通过 Websocket 握手访问身份验证,因为它传输 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();
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以在存储在 websocket 会话中的处理程序中验证经过身份验证的使用