通过 spring websocket、sockJs 和 STOMP 向经过身份验证的用户发送通知

Posted

技术标签:

【中文标题】通过 spring websocket、sockJs 和 STOMP 向经过身份验证的用户发送通知【英文标题】:Send notification to authenticated user over spring websocket, sockJs and STOMP 【发布时间】:2018-11-07 20:35:33 【问题描述】:

我有一个基于 JWT 的应用程序,由 spring security 保护。一切都是安全的并且工作正常。此外,应用程序公开了一个 websocket url (localhost:8080/ws),用户可以订阅 ("/realtime") 并接收通用更新,即每个经过身份验证或未经身份验证的用户都将收到更新。

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer 

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) 
        config.enableSimpleBroker("/realtime");

        config.setApplicationDestinationPrefixes("/app");
    

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) 
        registry.addEndpoint("/ws")
                .setAllowedOrigins("*")
                .withSockJS();

    


客户端代码:

//private _channel = "/realtime";
  constructor()
    this.connect();
  
  public connect() : void 
      let self = this;
      var token = localStorage.getItem("token");//get jwt from storage
      self._webSocketUrl = "http://localhost:8080/ws";
      //let webSocket = new WebSocket(this._webSocketUrl);//without sockjs
      let webSocket = new SockJS(this._webSocketUrl);//with sockjs
      self._stompClient = Stomp.over(webSocket);
      self._stompClient.connect(, function (frame) 
        self._stompClient.subscribe("/realtime", function (stompResponse) 

              console.log("got data from server");
              self._stompSubject.next(stompResponse);
          );
      );
  

所有这些都运行良好。现在,每当服务器上发生他们感兴趣的事情时,我需要向特定的经过身份验证的用户发送通知。所以,我从来没有收到用户的任何消息。每当经过身份验证的用户需要发送请求时,他都可以通过 rest 端点而不是 websocket 来完成。因此,一旦他登录,连接到 /ws 端点并订阅“/实时目的地”,他就完成了。现在,我的工作是在特定用户可用时向他们发送通知。这是一种方式(服务器到客户端)通过 websocket 进行通信。这将在未来发生变化。

所以,每当我为经过身份验证的用户提供一些东西时,例如 user123@gmail.com,我如何通过 websocket 向他发送通知?

我浏览了很多关于 *** 的链接和问题,但找不到任何有用的东西。

【问题讨论】:

【参考方案1】:

我能够通过执行以下操作来完成这项工作:

    在订阅中使用身份验证主体,例如

    self._stompClient.subscribe("/realtime/" + userName, function (stompResponse) 
    
          console.log("got data from server");
          self._stompSubject.next(stompResponse);
      );
    

    );

    发送给用户

    simpMessagingTemplate.convertAndSendToUser(userName, "/realtime/", message);
    

请注意,此解决方案可能无法提供适当的安全控制。请查看https://docs.spring.io/spring-security/site/docs/current/reference/html/websocket.html

【讨论】:

谢谢,但没用。这就是我改变的。 simpMessagingTemplate.convertAndSendToUser("user123@gmail.com", "/realtime", "MsgToUser123");和客户端:self._stompClient.subscribe("/realtime/user123@gmail.com", function (stompResponse)

以上是关于通过 spring websocket、sockJs 和 STOMP 向经过身份验证的用户发送通知的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Spring SockJs websocket 实现添加 cookie

将 Spring websockets (sockJS + Stomp) 与基于令牌的身份验证 (JWT) 一起使用的最佳方法

带有 Sockjs 和 Spring 4 但没有 Stomp 的 WebSocket

如何使用 spring+stomp+sockjs 获得 websocket 响应

Spring-Websockets 4.2 中使用 SockJS 的部分消息

Spring(Websockets / REST / Security)、JWT 和 Sockjs(Stomp)集成