java - 具有 stomp 安全性的 Spring websocket - 每个用户都可以订阅任何其他用户队列?

标签 java spring spring-security websocket stomp

我创建了一个使用 spring 4 的 websockets 机制的简单应用程序。 我在我的应用程序中使用了一个 activemq 代理。

在我的简单测试中,我为名为“Alejando”的用户创建了 10 条消息(user/alejandro/queue/greetings)

当我使用“Alejando”登录并订阅该队列时:

  stompClient.subscribe('/user/alejandro/queue/greetings', function(greeting){
                  showGreeting(JSON.parse(greeting.body).content);
  }); 

我确实收到了为 alejandro 查询的所有 10 条消息。

问题是,当我用另一个名为“evilBart”的用户登录并订阅 alejandro 的队列时,我也收到消息了吗?

我如何为此实现安全措施?我希望用户只能订阅自己的队列。

谢谢!

我的配置类:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableStompBrokerRelay("/queue/","/topic","/user/");     
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/hello").withSockJS();
}

}

最佳答案

您可以选择两个选项。

  1. 只需从 config.enableStompBrokerRelay 中删除“/user/”。 Spring 消息会自动添加前缀。

    convertAndSendToUser 不适用于代理中继。

See org.springframework.messaging.simp.user packages source



默认用户前缀是“/user/”。 您可以使用 config.setUserDestinationPrefix() 更改它





2.重写两个方法,从ChannelInterceptor处理

方法:

  • 配置ClientInboundChannel
  • configureClientOutboundChannel
  • 关于java - 具有 stomp 安全性的 Spring websocket - 每个用户都可以订阅任何其他用户队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778451/

    相关文章:

    java - 如何使用观察者模式通过线程进行文件监视?

    java - 使用 RestTemplate 对 REST API 调用中的对象列表做出空响应

    Spring 初始化 : spring-boot-starter vs spring-boot-starter-web

    java - 为什么 Spring Security permitAll() 不适用于 OAuth2.0?

    spring-boot - 如何仅在 localhost 的 spring security 中禁用 csrf?

    java - 从登录 URL 重定向

    java - 如何使用 UTF-8 读取 InputStream?

    java - 在 Cassandra 中使用 Java(datastax 驱动程序)按时间戳进行选择

    java - 设置组合域 JFreeChart 中绘图的大小

    java - 如何在 Spring JPA/Hibernate 中使用 JoinTable 设置仅通过 ID 引用父实体的子实体