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

时间:2014-08-26 08:47:06

标签: spring websocket sockjs spring-4

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

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

解决方案是扩展DefaultHandshakeHandler并覆盖determineUser方法。 问题是 - 从IE8连接时从不调用此方法。 非常感谢任何帮助。感谢,

2 个答案:

答案 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()  {
    ...
}