我想根据用户权限拒绝订阅。我找到了以下解决方案,它有助于支持websocket的浏览器:
https://github.com/rstoyanchev/spring-websocket-portfolio/issues/23
解决方案是扩展DefaultHandshakeHandler并覆盖determineUser方法。 问题是 - 从IE8连接时从不调用此方法。 非常感谢任何帮助。感谢,
答案 0 :(得分:3)
听起来您的问题更多的是如何将用户与会话相关联。默认情况下,WebSocket会话在握手期间从HttpServletRequest获取用户(即getPrincipal)。 DefaultHandshakeHandler确实提供了受保护的方法,但只适用于WebSocket传输。因此,目前将用户与WebSocket会话相关联的最佳方法是包装HttpServletRequest(例如在过滤器中)并返回用户。
答案 1 :(得分:1)
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() {
...
}