Spring-webSocket-拒绝基于用户权限的主题订阅,IE8-determineUser()从未调用



我想根据用户权限拒绝订阅。我找到了以下解决方案,它对支持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()  {
    ...
}

相关内容

  • 没有找到相关文章

最新更新