gpt4 book ai didi

java - 确保基于 Spring 消息传递的 websocket 服务的安全

转载 作者:行者123 更新时间:2023-11-30 02:24:48 25 4
gpt4 key购买 nike

我已经为此工作了 3 周,但没有找到真正的解决方案,我真的希望你能帮助我。

一些项目背景:

  • 具有基于 JavaScript/PHP 的客户端的 Web 应用程序通过 SocksJS 和 Stomp 向“门”发送消息

  • 该门是用 Java/Spring 编写的,并使用 @SendTo 和 @MessageMapping 来发送和接收消息

  • 来自gate的消息被发送到RabbitMQ并通过“messageBrokerRegistry.enableStompBrokerRelay”返回到客户端

到目前为止一切正常,发送的消息正在返回。

现在是高级安全部分:

  • 应通过包含用户和内容的 cookie 来保护消息的安全...

据我所知,WebSockets 本身不支持安全性。您必须像具有基本身份验证或类似功能的“常见”网络应用程序一样保护您的网络应用程序。因此,我添加了一个 servlet 过滤器,其中包含一个扩展 GenericFilterBean 的类。如果用户发送了正确的 cookie,页面就会加载,否则他会收到 403 错误。

现在问题来了:

由于 @SendTo 向所有订阅者发送消息,而 @SendToUser 似乎仅将其发送到一个 session ,因此我倾向于使用 @SendToUser。但似乎没有办法选择要创建的rabbitMQ队列。我想要一些像“/myqueue-user-123”的内容。这对于 @SendToUser 来说是不可能的,因为生成的队列是随机的并且基于 SessionID,我无法覆盖它。

所以我尝试过(除了拦截器、事件等之外,我尝试了很多东西),使用不带值的@SendTo,以便客户端可以决定它必须发送到的队列。

我现在需要的是评估 cookie 中的用户是否与“/myqueue/user-123”相关。如果不是,请勿将消息发送给他。阻止他订阅。不管怎样,断开他的联系。

但在我看来你根本不可能- 停止发送消息,只是“拦截”记录它们而不改变- 断开 websocket,因为它会自动尝试重新连接- 抛出异常,因为订阅无论如何都会成功(事件只是事件,而不是干扰的东西)。

如果您有任何建议或提示,我将非常感激。因为我完全被困在这里......

最佳答案

我理解你的痛苦,我花了两天时间试图理解有关 WebSocket 的 spring 安全困惑。

Websocket 不正式支持一种身份验证方式,但是 spring-security 确实支持(或多或少)。

我建议您在 WebSocket 级别进行身份验证,而不是在 HTTP 级别进行身份验证,大多数 WebSocket(和 stomp)的 JavaScript 库不会随 HTTP 握手一起发送 header 。

您将找到有关如何在 WebSocket 级别进行身份验证的详细指南 here 。在上面的示例中,我使用 Websocket headers 值来验证我的客户端,您可以将您的 cookie 值放入这些 header 中,或者将 cookie 替换为 localstorage。

使用此方法,您将可以访问 Controller 中的 Principal,这应该可以解决 SendToUser 问题。

关于java - 确保基于 Spring 消息传递的 websocket 服务的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com