Лучший подход к использованию веб-сокетов Spring (sockJS + Stomp) с аутентификацией на основе токенов (JWT)
Я хочу использовать веб-сокеты ( sockJS с Stomp) в загрузочном приложении Spring с аутентификацией на основе токенов с помощью Json Web Token (JWT). На сервере есть фильтр, который проверяет токен JWT. Этот токен отправляет заголовки запроса, но API- интерфейс клиента SockJS не поддерживает заголовки. Это означает, что когда API-интерфейс клиента SockJS пытается выполнить рукопожатие websocket с сервером, как, например:
new SockJS("http://localhost:8080/websocket")
HTTP-запрос будет перехвачен фильтром авторизации JWT, и рукопожатие не будет выполнено, так как в запросе нет заголовков, и, следовательно, запрос будет отклонен фильтром. Я видел несколько обходных путей, предложенных на форумах, но ни один из них не подходит для этого сценария:
- HandshakeInterceptor: это решение не работает, потому что фильтры всегда выполняются перед перехватчиками.
- Отправка заголовка аутентификации на заголовки STOMP также не работает, потому что STOMP-соединение происходит после рукопожатия, естественно.
Я обнаружил, что можно отправить токен по URL-адресу рукопожатия SockJS через параметры запроса, и мне придется изменить фильтр аутентификации, чтобы также искать параметры запроса, а не только заголовки. Мне не очень нравится это решение для отправки токена по параметрам запроса из соображений безопасности. Есть ли лучшая альтернатива или это действительно лучший подход?
0 ответов
HandshakeInterceptor: это решение не работает, потому что фильтры всегда выполняются перед перехватчиками.
Это то, что я сделал с точно такой же настройкой, что и у вас.
Вам нужно добавить websocket endpoint
в
@Override public void configure(WebSecurity registry)
лайк
registry.ignoring().antMatchers("/websocket/**");
Это сообщит Spring Security о том, что не нужно запускать конечные точки сокетов и, следовательно, фильтр, который вы настроили для jwt
,