Spring Stomp SimpUserRegistry Анонимные пользователи

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


person Roberto Graham    schedule 04.03.2019    source источник
comment
Насколько облачно ваше приложение имеет неаутентифицированный сеанс? вы имеете в виду анонимного пользователя?   -  person howie    schedule 04.03.2019
comment
Да, я это имел в виду, извините   -  person Roberto Graham    schedule 04.03.2019
comment
Не могли бы вы указать, какую версию spring-framework/spring boot вы используете?   -  person FlorianDe    schedule 04.03.2019
comment
@FlorianDe 2.1.3.RELEASE весенняя загрузка   -  person Roberto Graham    schedule 04.03.2019


Ответы (2)


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

Но если вы действительно хотите добавить анонимных пользователей, вам просто нужно создать подкласс класса DefaultHandshakeHandler и переопределить метод defineUser, как указано в Spring Doc для версии 5.0.0.M1 — Глава 22. Это также должно работать для версии 5.1.5.Release, которую вы сейчас используете при использовании Spring Boot 2.1.3.RELEASE:

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

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

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

person FlorianDe    schedule 04.03.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 и настройте его.

person howie    schedule 04.03.2019