SimpUserRegistry
позволяет вам получить информацию обо всех аутентифицированных сеансах Stomp, есть ли такой класс, который позволит мне перебирать сеансы анонимных пользователей?
Spring Stomp SimpUserRegistry Анонимные пользователи
Ответы (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 или нет.
Ниже приведены некоторые фрагменты кода из 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 и настройте его.