Spring 4 WebSocket over STOMP身份验证

Spring 4 WebSocket over STOMP身份验证,spring,spring-security,stomp,spring-websocket,Spring,Spring Security,Stomp,Spring Websocket,我正在开发一款基于Spring4WebSocket的多人游戏。 我的服务器是无状态的,所以为了识别玩家,我使用令牌 在为如何通过WebSocket识别玩家而苦苦挣扎了一段时间后,我想出了一个解决方案:在客户端上,玩家注册如下: var sockjs = new SockJS("http://mygame/games/", null, {server : token}); 这会将令牌添加到url,我已经使用spring security设置了一个过滤器: String requestURI =

我正在开发一款基于Spring4WebSocket的多人游戏。 我的服务器是无状态的,所以为了识别玩家,我使用令牌

在为如何通过WebSocket识别玩家而苦苦挣扎了一段时间后,我想出了一个解决方案:在客户端上,玩家注册如下:

var sockjs = new SockJS("http://mygame/games/", null, {server : token});
这会将令牌添加到url,我已经使用spring security设置了一个过滤器:

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));
}
String requestURI=request.getRequestURI();
String[]parts=StringUtils.split(requestURI,“/”);
如果(parts.length==4){
字符串标记=部分[1];
列表权限=新建ArrayList();
添加(新的SimpleGrantedAuthority(Role.Role_MULTIPLAYER));
SecurityContextHolder.getContext().setAuthentication(新的预验证身份验证token(token,“MULTIPLAYER”,authorities));
}
而且它有效!在所有WebSocket请求中,我都有一个主体集

然而,一些浏览器似乎不支持这一点,例如在Safari中,主体未设置,在调试请求时,我看到URL是正确的,过滤器工作,但主体未设置。IE、Chrome和FF作品也是如此。 我使用STOMP()作为messege协议

为什么浏览器之间有不同的行为?
这是春天的问题还是客户的问题?

我也想知道这一点。另外:如果使用普通WebSocket而不使用SockJS,该如何处理?您能告诉我在哪里使用示例代码吗?