【发布时间】:2016-03-30 08:07:47
【问题描述】:
我在公司环境中使用spring-messaging websockets。 spring-messaging 组件在 DMZ 中运行。它通过防火墙连接到 ActiveMQ 代理网络,进入内部网络。连接在 DMZ 中使用 spring-security 进行身份验证,并且用户主体可用。
我需要订阅用户特定的主题,内部网络中的服务可以通过它们与 ActiveMQ 的连接来发布这些主题。 spring-messaging /user 前缀似乎提供了这种功能。
开箱即用,如果我通过身份验证并且订阅了 /user/foo/bar 的主题,那么 DefaultUserDestinationResolver 会将其转换为会话 ID,在 ActiveMQ 中,我会看到 STOMP 连接器对主题的订阅/foo/bar-userjf44st89。在我的场景中有两个问题。
会话 ID
jf44st89无法转换回用户 ID,因此内部网络中的服务无法通过其 ActiveMQ 连接发布给特定用户。它们不是,也永远不会是从内部网络通过防火墙到运行 spring-messaging 组件的 DMZ 的允许路由起源,因此任何涉及发布到 spring-messaging 组件的解决方案都已失效.似乎没有什么可以阻止经过身份验证但未经授权的用户尝试猜测会话 ID 并订阅
/foo/bar-userjf44st89等主题。不太可能成功,但我更喜欢不可能。
所以我想用我自己的 bean 来增强 DefaultUserDestinationResolver,它将创建 /user/user-id/session-id/foo/bar 形式的订阅,这应该解决这两个问题并允许内部服务使用 ActiveMQ * 通配符来忽略会话- id 路径组件。
我的主要问题是如何最好地替换DefaultUserDestinationResolver?它由AbstractMessageBrokerConfiguration 类创建为一个bean。用户创建自己的@Primary UserDestinationResolver bean 的预期方法是什么?我想保留DefaultUserDestinationResolver 的大部分功能,只修改它生成的主题格式。
【问题讨论】:
-
我想你从来没有想过这个?我也需要知道如何做到这一点。你的问题给了我一个我没有的提示(重新,@Primary),但我正在努力让它发挥作用。有什么想法,有人吗?如何替换 DefaultUserDestinationResolver? (FWIW,如果使用集群的 RabbitMQ 环境,它不会非常有效地工作,因为生成的队列名称之间经常会发生冲突,从而导致可预见的灾难性结果。)
-
@VanessaWilliams 我将添加一个答案来说明我们是如何做到的,而不是试图将代码压缩到 cmets 部分。
标签: java spring spring-security spring-websocket spring-messaging