2

我想根据用户权限拒绝订阅。我找到了以下解决方案,它对支持 websocket 的浏览器有帮助:

https://github.com/rstoyanchev/spring-websocket-portfolio/issues/23

解决方案是扩展 DefaultHandshakeHandler 并覆盖确定用户方法。问题是 - 从 IE8 连接时永远不会调用此方法。将不胜感激任何帮助。谢谢,

4

2 回答 2

3

听起来您的问题更多是关于如何将用户与会话相关联。默认情况下,WebSocket 会话在握手期间从 HttpServletRequest 获取用户(即 getPrincipal)。DefaultHandshakeHandler 确实提供了一个受保护的方法,但仅适用于 WebSocket 传输。因此,目前将用户与 WebSocket 会话相关联的最佳方式是包装 HttpServletRequest(例如在过滤器中)并返回用户。

于 2014-08-28T13:12:09.287 回答
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()  {
    ...
}
于 2014-08-28T17:13:32.143 回答