Я настраиваю свое приложение для весенней загрузки. Проблема с моим приложением заключается в том, что соединения 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 ...
Я думаю, что это проблема, и я не хочу, чтобы мое приложение поддерживало соединения с сотнями сокетов, не прошедших проверку подлинности.