# WebSocket 安全

Spring Security4.0+ 为授权消息提供了支持。这一点很有用的一个具体例子是在基于 WebSocket 的应用程序中提供授权。

# <websocket-message-broker>

WebSocket-message-broker 元素有两种不同的模式。如果没有指定[[[email protected]](#NSA- WebSocket-message-broker-id),那么它将执行以下操作:

  • 确保任何 SimpAnnotationMethodMessageHandler 都将身份验证原则 argumentResolver 注册为自定义参数解析器。这允许使用@AuthenticationPrincipal来解析当前Authentication的主体

  • 确保 SecurityContextChannelInterceptor 已自动注册为 ClientBoundChannel。这将用消息中找到的用户填充 SecurityContextholder

  • 确保通道安全拦截器已在客户端 BoundChannel 中注册。这允许为消息指定授权规则。

  • 确保一个 CSRFChannelInterceptor 已在 ClientInboundChannel 中注册。这确保只启用来自原始域的请求。

  • 确保 CSRFTokenhandShakeInterceptor 已注册到 WebSockettPrequesthandler、TransportHandlingSockJSService 或 DefaultSockJSService。这确保了预期的来自 HttpServletRequest 的 CSRFToken 被复制到 WebSocket 会话属性中。

如果需要额外的控制,可以指定 ID,并将为指定的 ID 分配一个通道 SecurityInterceptor。然后,所有与 Spring 的消息传递基础设施的连接都可以手动完成。这比较麻烦,但提供了对配置的更大控制。

# <websocket-message-broker>属性

  • 身份证一个 Bean 标识符,用于在上下文的其他地方引用 ChannelSecurityInterceptor Bean。如果指定了, Spring 安全性要求在 Spring 消息传递中进行显式配置。如果没有指定, Spring 安全性将自动与消息传递基础设施集成,如<websocket-message-broker>中所述

  • 同源禁用禁用在 stomp 标头中存在的 CSRF 令牌的要求(默认为 false)。如果有必要允许其他来源建立 Sockjs 连接,那么更改默认值是有用的。

# <websocket-message-broker>的子元素

# <intercept-message>

为消息定义授权规则。

# <intercept-message>的父元素

# <intercept-message>属性

  • 模式一种基于 Ant 的模式,它在消息目标上匹配。例如,“/”匹配带有目的地的任何消息;“/admin/”匹配带有以“/admin/***”开头的目的地的任何消息。

  • 类型要匹配的消息类型。有效的值在 SimpMessageType 中定义(即 Connect、Connect_ack、heartbeat、Message、Subscribe、Unsubscribe、Disconnect、Disconnect_ack、Other)。

  • 访问用于保护消息的表达式。例如,“denyall”将拒绝对所有匹配消息的访问;“permitall”将授予对所有匹配消息的访问权限;"HasRole(’admin’)要求当前用户拥有用于匹配消息的角色’role_admin’。

LDAP 安全性FAQ