授权 (Authorization)
在建立连接并通过身份验证后,下一步通常是根据用户的身份和权限来限制他们可以发送什么消息或订阅哪些主题。
Spring 提供了以下支持:
- WebSocket 子协议授权: Spring Security 提供了专门针对 WebSocket 的支持,它使用
ChannelInterceptor根据消息中的用户标头对消息进行授权。你可以针对不同的目的地模式(Destinations)和消息类型(如 SUBSCRIBE, SEND)配置权限规则。 - 会话保持: Spring Session 提供了 WebSocket 集成,确保只要 WebSocket 会话仍然活跃,用户的 HTTP 会话就不会过期。
详情请参阅:
补充教学
1. 为什么需要消息级授权?
即便握手成功了,你也可能不希望所有登录用户都能订阅 /topic/admin.logs。通过 Spring Security 的配置,你可以精细到每条消息的控制。
2. 典型的配置结构
在 Spring Security 6 中,授权通常像这样配置:
java
@Configuration
public class WebSocketSecurityConfig {
@Bean
AuthorizationManager<Message<?>> messageAuthorizationManager(MessageMatcherDelegatingAuthorizationManager.Builder messages) {
messages
.simpDestMatchers("/topic/public/**").permitAll()
.simpSubscribeDestMatchers("/topic/admin/**").hasRole("ADMIN")
.anyMessage().authenticated();
return messages.build();
}
}3. 主动心跳与 Session 过期
由于 WebSocket 是长连接,如果不配合 Spring Session,Servlet 容器的 HTTP Session 可能会因为没有新的 HTTP 请求而过期。启用相关集成后,每一帧 STOMP 消息都会被视为一次“触碰”,有效防止会话意外中止。