Spring 4 WebSockect через аутентификацию STOMP

Я разрабатываю многопользовательскую игру на основе Spring 4 WebSocket. мой сервер не имеет гражданства, поэтому для идентификации игроков я использую токены.

после того, как я какое-то время боролся с тем, как идентифицировать игроков через WebSockets, я придумал это решение: на клиенте игрок регистрируется следующим образом:

var sockjs = new SockJS("http://mygame/games/", null, {server : token});

это добавляет токен к URL-адресу, я настроил фильтр с использованием весенней безопасности:

String requestURI = request.getRequestURI();
String[] parts = StringUtils.split(requestURI, "/");
if (parts.length == 4) {
    String token = parts[1];
   List<GrantedAuthority> authorities = new ArrayList<>();
   authorities.add(new SimpleGrantedAuthority(Role.ROLE_MULTIPLAYER)));
   SecurityContextHolder.getContext().setAuthentication(new PreAuthenticatedAuthenticationToken(token, "MULTIPLAYER", authorities));
}

и это работает! во всех запросах WebSockets у меня есть основной набор.

Однако некоторые браузеры, похоже, не поддерживают это, например, в Safari Принципал не установлен, при отладке запроса я вижу, что URL-адрес правильный, и фильтр работает, но Принципал не установлен. то же самое касается IE, Chrome и FF. Я использую STOMP (https://github.com/jmesnil/stomp-websocket) как протокол сообщения.

почему браузеры ведут себя по-разному? это проблема Spring или Client?


person Yoav A    schedule 10.08.2014    source источник
comment
Мне тоже интересно это узнать. Также: как с этим справиться, если вы используете простые веб-сокеты без использования SockJS?   -  person Alessandro Polverini    schedule 31.08.2014
comment
Можете ли вы сказать мне, где вы используете свой пример кода?   -  person Sergio    schedule 10.09.2016