Лучший подход к использованию Spring websockets (sockJS + Stomp) с аутентификацией на основе токенов (JWT) - PullRequest
0 голосов
/ 29 октября 2018

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

1 Ответ

0 голосов
/ 28 апреля 2019

HandshakeInterceptor: это решение не работает, потому что фильтры всегда выполнять перед перехватчиками.

Это то, что я сделал с точно такой же настройкой, что и у вас.

Вам нужно добавить websocket endpoint к

@Override public void configure(WebSecurity registry)

как

registry.ignoring().antMatchers("/websocket/**");

Это сообщит Spring Security о том, что не нужно запускать конечные точки сокетов, и, следовательно, фильтр, который вы настроили для jwt.

...