Spring Stomp SimpUserRegistry Анонимные пользователи - PullRequest
0 голосов
/ 04 марта 2019

SimpUserRegistry позволяет вам получить подробную информацию обо всех аутентифицированных сеансах Stomp, есть ли такой класс, который позволит мне выполнять итерации по сеансам анонимного пользователя?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Как и Howie , описанные в его ответе, только неанонимные пользователи будут добавлены в SimpUserRegistry.

Но если вы действительно хотите добавить анонимных пользователей, вам просто нужно добавитьКласс Class DefaultHandshakeHandler и переопределить метод defineUser, как указано в Spring Doc для версии 5.0.0.M1 - Глава 22 * ​​1007 *.Это также должно работать для 5.1.5. Отпустите, который вы в данный момент используете при использовании Spring Boot 2.1.3.RELEASE:

В некоторых случаях может быть полезно назначить идентификатор сеансу WebSocketдаже когда пользователь не был официально аутентифицирован.Например, мобильное приложение может назначать анонимным пользователям некоторую идентификацию, возможно, в зависимости от географического местоположения.В настоящее время приложение может подкласс DefaultHandshakeHandler и переопределить метод defineUser.Затем можно подключить пользовательский обработчик рукопожатия (см. Примеры в разделе 22.2.4, «Вопросы развертывания»).

Вот ответ ( пружинные веб-сокеты без принципала ), которыйпоказывает, как можно добиться создания AnonymousPrincipal и определить его в пользовательском обработчике рукопожатия.

И, наконец, вам нужно добавить свой экземпляр обработчика настраиваемого рукопожатия в зарегистрированную конечную точку, но это зависит от того,Вы используете STOMP или нет.

0 голосов
/ 04 марта 2019

Ниже приведены некоторые фрагменты кода из StompSubProtocolHandler. Метод handleMessageFromClient добавляет пользователя на карту stompAuthentications и публикует событие SessionConnectEvent. *

public void handleMessageFromClient(WebSocketSession session, WebSocketMessage<?> webSocketMessage, MessageChannel outputChannel) {
//...
SimpAttributesContextHolder.setAttributesFromMessage(message);
boolean sent = outputChannel.send(message);

if (sent) {
    if (isConnect) {
        Principal user = headerAccessor.getUser();
        if (user != null && user != session.getPrincipal()) {
            this.stompAuthentications.put(session.getId(), user);
        }else{
              //TODO try to handle here for anonymous user
        }
    }
    if (this.eventPublisher != null) {
        if (isConnect) {
            publishEvent(new SessionConnectEvent(this, message, getUser(session)));
        }
//...

Я думаю, что вам нужно проверить этот код *StompSubProtocolHandler и настройте его.

...