Отправьте уведомление аутентифицированному пользователю через Spring Websocket, SockJs и STOMP - PullRequest
0 голосов
/ 29 мая 2018

У меня есть приложение на основе JWT, защищенное пружинной безопасностью.Все защищено и работает нормально.Кроме того, приложение предоставляет 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);
          });
      });
  }

Все это работает нормально.Теперь мне нужно отправлять уведомления конкретному аутентифицированному пользователю всякий раз, когда на сервере происходит что-то его интересующее.Поэтому я никогда не получаю сообщений от пользователей.Всякий раз, когда аутентифицированному пользователю необходимо отправить запрос, он может сделать это через конечные точки отдыха, а не через веб-сокет.Итак, после того, как он вошел в систему, подключился к конечной точке / ws и подписался на "/ назначение в реальном времени, он завершил. Теперь моя работа - отправлять им уведомления всякий раз, когда они доступны для конкретного пользователя. Это своего рода одностороннийклиент) связь через websocket. Это изменится в будущем.

Итак, всякий раз, когда у меня есть что-то для аутентифицированного пользователя, скажем, user123@gmail.com, как я могу отправить ему уведомление через websocket?

Я просмотрел много ссылок и вопросов по stackoverflow, но не смог найти ничего, что работает.

1 Ответ

0 голосов
/ 29 мая 2018

Мне удалось добиться этого, выполнив следующие действия:

  1. Использование принципала проверки подлинности в подписке, например

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

    });

  2. Отправить пользователю как

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

Обратите внимание, что это решение может не обеспечивать надлежащие меры безопасности .Пожалуйста, просмотрите https://docs.spring.io/spring-security/site/docs/current/reference/html/websocket.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...