Как закрыть соединения Websocket при неудачной аутентификации? - PullRequest
0 голосов
/ 02 января 2019

Я настраиваю свое приложение для весенней загрузки. Проблема с моим приложением заключается в том, что соединения WebSocket по-прежнему открыты после неудачной аутентификации Spring. Я не аутентифицировал пользователя до этого, чтобы протестировать приложение в нестандартных ситуациях.

Для моей конфигурации требуется роль "USER" для команды CONNECT.

@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
    messages
        .nullDestMatcher().hasRole("USER")
        .simpDestMatchers("/app/info").hasRole("USER")
        .simpSubscribeDestMatchers("/user/queue/info").hasRole("USER")
        .anyMessage().denyAll();
}

Я ожидал закрытое соединение на стороне сервера, но получил следующее сообщение на стороне клиента:

"<<< ERROR content-length:0 message:Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.access.AccessDeniedException\c Access is denied content-length:0

... и соединение все еще активно.

Чтобы подтвердить, что соединение активно, я использовал @EventListener:

@EventListener
public void onDisconnectEvent(SessionDisconnectEvent event) {
    // print debug message
}

... и закрыл соединение вручную на стороне клиента. Я снова смог увидеть трассировку закрытого стека соединений:

// print debug message

* + * Тысяча двадцать-один

org.springframework.messaging.MessageDeliveryException: Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.access.AccessDeniedException: Access is denied at ...

Я думаю, что это проблема, и я не хочу, чтобы мое приложение поддерживало соединения с сотнями сокетов, не прошедших проверку подлинности.

...