Я хочу создать Spring Server и клиент javascript Broswer, подключающийся через sockjs-client. Соединение должно быть защищено с помощью Spring Security.
У меня следующая дилемма:
Spring Security, похоже, предполагает, что рукопожатие веб-сокета происходит через аутентифицированный http-сеанс (например, набор файлов cookie JSESSIONID, вход в систему).
sockjs-client, однако, похоже, накладывает на разработчиков ограничение, заключающееся в том, что никакой аутентифицированный http-сеанс не должен использоваться (см. https://github.com/sockjs/sockjs-client/issues/196).), применяя это любым возможным способом.
Верна ли моя оценка дилеммы, и есть ли какое-либо очевидное решение для реализации безопасности на сервере spring с веб-сокетами, чтобы sockjs-client мог безопасно подключаться?
Предлагаемое решение передачи любого токена аутентификации в запросе GET /info похоже на хаки, чтобы обойти ограничения безопасности SockJS, если они используются для создания аутентифицированного HttpSession.
Это, по-видимому, является причиной проблем для нескольких людей, таких как:
- Нет файлов cookie во время запроса /info с использованием sockjs и stomp
- Модель аутентификации для Spring Websocket + SockJS и отправка сообщений для каждого пользователя
- Как получить/установить атрибуты участника и сеанса из методов веб-сокета Spring 4 stomp
- https://stackoverflow.com/questions/33156282
- Spring Websockets @SendToUser без входа в систему?
- Токен Spring Session Basic Auth передается как параметр запроса в Spring-Websocket
- Веб-сокет безопасности Spring и HTTP-аутентификация/авторизация
- Spring Session, поток интеграции Websocket Security
- Безопасность Spring/сеанс Spring/веб-сокеты
- Spring Boot, веб-сокеты не могут получить пользователя (например, java.security.Principal) из сеанса
- Spring 4 WebSockect через аутентификацию STOMP
- http://sunitkatkar.blogspot.de/2014/01/spring-4-websockets-with-sockjs-stomp.html
Я вижу 3 альтернативных пути:
- Не используйте SockJ, а только собственные веб-сокеты.
- использовать SockJS поверх аутентифицированного Http-сеанса через токен query-param и пожертвовать некоторой безопасностью
- Подключиться через неаутентифицированное http-соединение и реализовать пользовательскую обработку аутентификации для spring-websockets (возможно, на основе весеннего сеанса)