Spring Websocket允许客户端(即浏览器)直接将消息发送到任何代理支持的目的地,即允许绕过服务器端应用程序的直接客户端到客户端通信。在现实世界中,我认为直接向消息代理公开写入访问权限是不可接受的。出于安全性和消息完整性的原因,您通常只允许服务器应用程序通过代理向客户端发送任何消息。但我找不到有关如何实现这一目标的任何信息。默认行为是浏览器可以不受限制地直接访问代理目标。
这在技术上是不正确的,客户端和代理之间没有直接通信,无论目标类型如何,所有消息都通过您的应用程序。代理目标消息被转发到代理,这意味着您可以在它们到达代理之前随时拦截它们。Spring Security 4.0.0.RC1 支持 WebSocket 安全性,因此您可以对消息应用授权:
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.antMatchers(SimpMessageType.MESSAGE, "/topic/**").denyAll()
.antMatchers("/**").hasRole("ADMIN");
}
}
在上面的代码片段中,将消息发送到任何/topic
目标都将被拒绝,并且向其他目标发送任何其他操作都需要角色 ADMIN。如果这对您来说还不够,您可以随时实现自己的ChannelInterceptor
来拦截消息并将其添加到clientInboundChannel
中。