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

Spring webSocket-拒绝基于用户权限的主题订阅,IE8-determineUser()从未调用,spring,websocket,sockjs,spring-4,Spring,Websocket,Sockjs,Spring 4,我想根据用户权限拒绝订阅。我找到了以下解决方案,它有助于支持websocket的浏览器: 解决方案是扩展DefaultHandsheHandler并重写determineUser方法。 问题是-从IE8连接时从未调用此方法。 非常感谢您的帮助。谢谢,听起来您的问题更多的是关于如何将用户与会话关联。默认情况下,WebSocket会话在握手期间从HttpServletRequest获取用户,即getPrincipal。DefaultHandshakeHandler确实提供了一个受保护的方法,但该方法

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

解决方案是扩展DefaultHandsheHandler并重写determineUser方法。 问题是-从IE8连接时从未调用此方法。
非常感谢您的帮助。谢谢,

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

Spring Security 4增加了对WebSocket消息和订阅保护的支持。您可以使用Java配置对其进行配置:

@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    protected void configure(MessageSecurityMetadataSourceRegistry messages) {

        messages
                .destinationMatchers("/app/your.topic").hasRole("ADMIN")
                .anyMessage().hasRole("USER");

    }
}
这将使用角色\ u ADMIN保护发送到/app/your.topic的订阅和邮件。另一种解决方案是在控制器中映射订阅,并使用@PreAuthorize注释:

@PreAuthorize("hasRole('ROLE_ADMIN')")
@SubscribeMapping("/your.topic")
public String notifications()  {
    ...
}

对带有SubscribeMapping注释的方法的预授权将不起作用,因为这只是在订阅完成后在不同线程中调用的侦听器。它仅保护消息不受不具有“ADMIN”角色的用户的影响。如何保护用户B的“/user/A/message”订阅,以便只有用户A才能订阅