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

时间:2018-05-29 08:50:52

标签: java spring websocket

我有一个基于JWT的应用程序,由弹簧安全保护。一切都很安全,工作正常。此外,应用程序公开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);
          });
      });
  }

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

因此,每当我为经过身份验证的用户提供某些内容时,例如user123@gmail.com,我该如何通过websocket向他发送通知?

我在stackoverflow上经历了很多链接和问题,但找不到任何有用的东西。

1 个答案:

答案 0 :(得分:0)

我能够通过以下方式实现这一目标:

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

    selectedIndex = 0;
    ...
    
        ngOnInit() {
            setTimeout(() => {
                this.selectNextTab();
            }, 3000);
        }
    
        selectNextTab() {
            this.selectedIndex++;
        }
    ...
    

    });

  2. 的形式发送给用户
    self._stompClient.subscribe("/realtime/" + userName, function (stompResponse) {
    
          console.log("got data from server");
          self._stompSubject.next(stompResponse);
      });
    
  3. 请注意,此解决方案可能无法提供适当的安全控制。请查看https://docs.spring.io/spring-security/site/docs/current/reference/html/websocket.html