多用户的Spring websocket安全性



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

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

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

,因为他的用户名存储在principal中。

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

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

的内容
messagingTemplate
    .convertAndSendToUser(request.getFromUser(), "/queue/requests", request) 
messagingTemplate
    .convertAndSendToUser(request.getToUser(), "/queue/requests", request)

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

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

当用户使用Spring Security进行身份验证时,WebSocket模块基于该用户的Principal为该用户创建唯一通道。"/user/queue/position-updates"转换为"/queue/position-updates-user123"

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

在服务器端,通过convertAndSendToUser(request.getFromUser(), "/queue/requests", request)发送消息给/user/{username}/queue/requests, Spring处理其余的。

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

在服务器端,你可以通过@DestinationVariablePrincipal获取目标用户

@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);
    }

相关内容

  • 没有找到相关文章

最新更新