我创建了一个使用 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();
}
}
最佳答案
您可以选择两个选项。
- 只需从 config.enableStompBrokerRelay 中删除“/user/”。
Spring 消息会自动添加前缀。
convertAndSendToUser 不适用于代理中继。
See org.springframework.messaging.simp.user packages source
默认用户前缀是“/user/”。
您可以使用 config.setUserDestinationPrefix() 更改它
2.重写两个方法,从ChannelInterceptor处理
方法:
关于java - 具有 stomp 安全性的 Spring websocket - 每个用户都可以订阅任何其他用户队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778451/