gpt4 book ai didi

java - 如何自定义 spring-messaging websockets 用户订阅?

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:11 24 4
gpt4 key购买 nike

我正在使用spring-messaging websockets在企业环境中。 spring-messaging 组件在 DMZ 中运行。它通过防火墙连接到 ActiveMQ 代理网络,进入内部网络。使用 spring-security 在 DMZ 中对连接进行身份验证,并且用户主体可用。

我需要订阅特定于用户的主题,内部网络中的服务可以通过与 ActiveMQ 的连接来发布这些主题。 spring-messaging /user 前缀似乎提供了这种功能。

开箱即用,如果我通过身份验证并且订阅了 /user/foo/bar 主题,则 DefaultUserDestinationResolver 会将其转换为 session ID,并且在 ActiveMQ 中,我会看到 STOMP 连接器对 /foo/bar-userjf44st89 主题进行的订阅。在我的场景中存在两个问题。

  1. session ID jf44st89 无法转换回用户 ID,因此内部网络中的服务无法通过其 ActiveMQ 连接发布到特定用户。它们现在不是、也永远不会是从内部网络通过防火墙到达运行 spring-messaging 组件的 DMZ 的允许路由,因此任何涉及发布到 spring-messaging 组件的解决方案都已被淘汰。

  2. 似乎没有什么可以阻止经过身份验证但未经授权的用户尝试猜测 session ID 并订阅 /foo/bar-userjf44st89 等主题。不太可能成功,但我更喜欢不可能,而不是不太可能。

所以我想用我自己的 bean 增强 DefaultUserDestinationResolver ,它将创建 /user/user-id/session-id/foo/bar 形式的订阅,这应该解决这两个问题并允许内部服务使用 ActiveMQ * 通配符来忽略 session-id 路径组件。

我的主要问题是如何最好地替换 DefaultUserDestinationResolver?它由 AbstractMessageBrokerConfiguration 类创建为 bean。用户创建自己的 @Primary UserDestinationResolver bean 的预期方法是吗?我想保留 DefaultUserDestinationResolver 的大部分功能,只修改它生成的主题的格式。

最佳答案

由于没有建议其他答案,我想我应该发布我们采用的解决方案。基本上,我们使用了一个 @Primary bean 来覆盖替换默认解析器。

在下面的示例中,MyUserDestinationResolver 是一个扩展 DefaultUserDestinationResolver 的类,重写了 getTargetDestination() 方法。 SimpUserRegistry 对象是基类构造函数所必需的,但我们的实现实际上根本没有使用它。

@Configuration
public class UserDestinationResolverFactory {

@Inject
SimpUserRegistry userRegistry;

@Bean
@Primary
public UserDestinationResolver userDestinationResolver() {
return new MyUserDestinationResolver(this.userRegistry);
}
}

关于java - 如何自定义 spring-messaging websockets 用户订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36303073/

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