适用于多个用户的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)
Spring WebSocket处理/用户通道,所以我使用了那些方法
这就是我解决这个问题的方法:
当用户使用Spring Security进行身份validation时,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}
在服务器端,您可以使用@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); }