我想根据用户权限拒绝订阅。我找到了以下解决方案,它对支持websocket的浏览器有帮助:
https://github.com/rstoyanchev/spring-websocket-portfolio/issues/23
解决方案是扩展DefaultHandshakeHandler并覆盖determineUser方法。问题是,当从IE8连接时,永远不会调用此方法。如果有任何帮助,我将不胜感激。谢谢,
听起来您的问题更多的是关于如何将用户与会话关联起来。默认情况下,WebSocket会话在握手期间(即getPrincipal)从HttpServlet请求获取用户。DefaultHandshakeHandler确实提供了一个受保护的方法,但它只适用于WebSocket传输。因此,目前将用户与WebSocket会话关联起来的最佳方式是包装HttpServlet请求(例如在Filter中)并返回用户。
Spring Security 4增加了对WebSocket消息和订阅保护的支持。您可以使用Java config:进行配置
@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configure(MessageSecurityMetadataSourceRegistry messages) {
messages
.destinationMatchers("/app/your.topic").hasRole("ADMIN")
.anyMessage().hasRole("USER");
}
}
这将保护使用角色role_ADMIN发送到/app/your.topic的订阅和消息。另一个解决方案是在控制器中映射订阅并使用@PreAuthorize
注释:
@PreAuthorize("hasRole('ROLE_ADMIN')")
@SubscribeMapping("/your.topic")
public String notifications() {
...
}