Лучший подход к использованию веб-сокетов Spring (sockJS + Stomp) с аутентификацией на основе токенов (JWT)

Я хочу использовать веб-сокеты (sockJS with Stomp) в загрузочном приложении Spring с аутентификацией на основе токенов. через Json Web Token (JWT). На сервере есть фильтр, который проверяет токен JWT. Этому токену отправляются заголовки запроса, но SockJS client api, не поддерживает заголовки. Это означает, что когда API-интерфейс клиента SockJS пытается выполнить рукопожатие веб-сокета с сервером, например:

new SockJS("http://localhost:8080/websocket")

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

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

Я узнал здесь, что это можно отправить токен на URL-адрес рукопожатия SockJS через параметры запроса, и мне пришлось бы изменить фильтр аутентификации, чтобы также искать параметры запроса, а не только заголовки. Мне не очень нравится это решение отправки токена по параметрам запроса из соображений безопасности. Есть ли лучшая альтернатива или это действительно лучший подход?


person theeDude    schedule 29.10.2018    source источник


Ответы (1)


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

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

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

@Override public void configure(WebSecurity registry)

как

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

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

person Adil Khalil    schedule 27.04.2019