Spring 多个用户的 websocket 安全

Spring websocket security for multiple users

我想在 spring 应用程序中使用 websocket 进行联系请求。我已经为用户设置了登录页面,并为此使用了 spring 安全性。我的问题如下:如何安全地将网络套接字消息发送给两个不同的用户。

我知道我可以通过 @SendTo() 向订阅了某个主题的每个用户广播消息,并且只能通过

向一个用户广播消息
messagingTemplate
    .convertAndSendToUser(principal.getName(), "/queue/requests", request);

因为他的用户名存储在主体中。

我的问题是当我们必须从请求中定位 2 个用户并使其安全时如何处理,这样您就不能在未经授权的情况下从客户端收听任何频道。

理想情况下,我正在寻找类似

的东西
messagingTemplate
    .convertAndSendToUser(request.getFromUser(), "/queue/requests", request) 

messagingTemplate
    .convertAndSendToUser(request.getToUser(), "/queue/requests", request)

您可以按照Spring-websocket-chat中给出的方法进行操作。 在客户端你可以有 /app/chat.private.{targetUser}

在服务器端,您可以使用 @DestinationVariable 获取目标用户,使用 Principal

获取源用户
@MessageMapping("/chat.private.{username}")
    public void filterPrivateMessage(@Payload ChatMessage message, @DestinationVariable("username") String username, Principal principal) {
        checkProfanityAndSanitize(message);

        message.setUsername(principal.getName());

        simpMessagingTemplate.convertAndSend("/user/" + username + "/queue/chat.message", message);
    }

Spring WebSocket 处理 /user 通道,所以我使用了那些方法

我就是这样解决这个问题的:

当用户使用 Spring 安全性进行身份验证时,WebSocket 模块会根据他的委托人为该用户创建唯一的通道。例如 "/user/queue/position-updates" 被翻译成 "/queue/position-updates-user123"

所以在客户端,我所要做的就是订阅 /user/queue/requests

在服务器端,使用 convertAndSendToUser(request.getFromUser(), "/queue/requests", request) 将消息发送到 /user/{username}/queue/requests,Spring 处理其余部分。