多个用户的Spring websocket安全性

时间:2015-10-25 21:00:00

标签: java spring spring-security websocket spring-websocket

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

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

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

因为他的用户名存储在本机中。

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

理想情况下,我正在寻找像

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

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

2 个答案:

答案 0 :(得分:1)

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

这就是我解决这个问题的方法:

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

因此,在客户端,我只需订阅/user/queue/requests

在服务器端,使用/user/{username}/queue/requestsconvertAndSendToUser(request.getFromUser(), "/queue/requests", request)发送消息,然后Spring处理其余消息。

答案 1 :(得分:0)

您可以执行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);
    }