WebSocket 安全

Spring Security 4.0+ 提供了授权消息的支持。一个具体的例子是,在基于 WebSocket 的应用程序中提供授权。

<websocket-message-broker>

websocket-message-broker 元素具有两种不同的模式。如果未指定websocket-message-broker@id,则它将执行以下操作

  • 确保任何 SimpAnnotationMethodMessageHandler 都注册了 AuthenticationPrincipalArgumentResolver 作为自定义参数解析器。这允许使用 @AuthenticationPrincipal 来解析当前 Authentication 的主体。

  • 确保为 clientInboundChannel 自动注册 SecurityContextChannelInterceptor。这将使用在消息中找到的用户填充 SecurityContextHolder。

  • 确保使用 clientInboundChannel 注册 ChannelSecurityInterceptor。这允许为消息指定授权规则。

  • 确保使用 clientInboundChannel 注册 CsrfChannelInterceptor。这确保仅启用来自原始域的请求。

  • 确保使用 WebSocketHttpRequestHandler、TransportHandlingSockJsService 或 DefaultSockJsService 注册 CsrfTokenHandshakeInterceptor。这确保将 HttpServletRequest 中的预期 CsrfToken 复制到 WebSocket 会话属性中。

如果需要额外的控制,可以指定 id,并且 ChannelSecurityInterceptor 将被分配到指定的 id。然后,可以使用 Spring 的消息传递基础架构手动完成所有连接。这更麻烦,但提供了对配置的更大控制。

<websocket-message-broker> 属性

  • id 一个 bean 标识符,用于在上下文的其他地方引用 ChannelSecurityInterceptor bean。如果指定,则 Spring Security 需要在 Spring Messaging 中进行显式配置。如果未指定,则 Spring Security 将自动与消息传递基础架构集成,如<websocket-message-broker>中所述。

  • same-origin-disabled 禁用在 Stomp 标头中存在 CSRF 令牌的要求(默认为 false)。如果需要允许其他来源建立 SockJS 连接,则更改默认设置很有用。

  • authorization-manager-ref 使用此 AuthorizationManager 实例;当设置时,use-authorization-manager 将被忽略并假定为 true

  • use-authorization-manager 使用 AuthorizationManager API 而不是 SecurityMetadataSource API(默认为 true)。

  • security-context-holder-strategy-ref 使用此 SecurityContextHolderStrategy(注意,仅在与 AuthorizationManager API 结合使用时才支持)。

<websocket-message-broker> 的子元素

<intercept-message>

定义消息的授权规则。

<intercept-message> 的父元素

<intercept-message> 属性

  • pattern 基于 ant 的模式,与消息目标匹配。例如,“/”匹配任何具有目标的消息;“/admin/”匹配任何目标以“/admin/**”开头的消息。

  • type 要匹配的消息类型。有效值在 SimpMessageType 中定义(即 CONNECT、CONNECT_ACK、HEARTBEAT、MESSAGE、SUBSCRIBE、UNSUBSCRIBE、DISCONNECT、DISCONNECT_ACK、OTHER)。

  • access 用于保护消息的表达式。例如,“denyAll”将拒绝访问所有匹配的消息;“permitAll”将授予访问所有匹配的消息的权限;“hasRole('ADMIN')”要求当前用户对匹配的消息具有“ROLE_ADMIN”角色。