【问题标题】:Spring websocket security for multiple users多个用户的 Spring websocket 安全性
【发布时间】:2015-10-25 20:59:59
【问题描述】:

我想在 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)

【问题讨论】:

  • 这个我觉得你需要Spring Security 4,而Spring Boot使用的是Spring Security 3..."Spring Security 4.0已经引入了对WebSockets的授权支持"

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


【解决方案1】:

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

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

当用户使用 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 处理。

【讨论】:

  • 这就是我想告诉你的......:)
【解决方案2】:

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

【讨论】:

  • 这是不安全的,因为任何用户都可以订阅任何频道
  • 您可以添加 websocket 安全性,并使用 spring security 向特定用户授予对特定通道的访问权限
  • 所以你希望接收消息的两个用户都没有被授权
猜你喜欢
  • 1970-01-01
  • 2020-10-23
  • 2014-12-08
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 2014-08-08
  • 2015-05-24
相关资源
最近更新 更多