Spring Boot WebSocket - Проблемы с очередью RabbitMQ - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок ie для веб-сокетов. Сейчас я тренируюсь и сталкиваюсь с некоторыми проблемами:

1) Когда клиент подключается к сокету, получает сообщение, подобное этому:

CONNECTED
    server:RabbitMQ/3.8.2
    session:session-yy0DydqMa2I9H355EhfpPw
    heart-beat:10000,10000
    version:1.1
    user-name:11111111111

Ответное сообщение содержит информацию о сервере. Я думал, что это сообщение специально для RabbitMQ, но это не так, я пытался с ActiveMQ Artemis, результат тот же. Это сообщение написано в классе WebSocketServerSockJsSession (как и любые другие сообщения). Я не могу понять, как предотвратить отправку информации о сервере. Это проблема безопасности? Как отключить отправку информации о сервере?

2) Если клиент отправляет параметр auto-delete в заголовке, очередь создается как недолговечная, то есть клиенты могут изменять настройки очереди. Это нормально, что клиенты браузера имеют такое разрешение? Как я могу предотвратить это?

$(function () {
    var csrf = $("meta[name='_csrf']").attr("content");
    var socket = new SockJS('/ws');
    var stompClient = Stomp.over(socket);
    stompClient.connect({'X-CSRF-TOKEN': csrf}, function (frame) {
        stompClient.subscribe('/user/queue/error', function (data) {
            console.log(data);
        },{'auto-delete' : true});
    });
});

3) Я полагаю, что Spring создает очереди как долговечные (я не уверен, просто догадываюсь). Как я могу гарантировать, что созданные очереди недолговечны (я не хочу, чтобы клиенты браузера принимали это решение)? В приведенном ниже примере создается долговременная очередь для каждого пользователя:

@MessageExceptionHandler
@SendToUser("/queue/error")
public String handleException(Exception ex) {
    return ex.getMessage();
}

Вот моя конфигурация для Spring (я не настраивал в RabbitMQ):

@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<Session> {

    @Override
    protected void configureStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay("/queue/", "/topic/")
                .setUserDestinationBroadcast("/topic/unresolved-user-destination")
                .setUserRegistryBroadcast("/topic/user-registry")
                .setRelayHost("localhost")
                .setRelayPort(61613)
                .setSystemLogin("guest")
                .setSystemPasscode("guest")
                .setClientLogin("client")
                .setClientPasscode("123");
        registry.setApplicationDestinationPrefixes("/ws-app");
    }
}

@Configuration
class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.simpSubscribeDestMatchers("/topic/**").permitAll()
                .simpSubscribeDestMatchers("/user/**", "/queue/**").hasRole("USER")
                .simpDestMatchers("/ws-app/send").hasRole("USER");
    }
}

Environment

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