如何使用 Spring Security 和 Spring Websocket 支持但没有 STOMP?

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 会话中的处理程序中验证经过身份验证的使用