WebSocket Security

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

<websocket-message-broker>

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

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

  • 确保 SecurityContextChannelInterceptor 会自动为 clientInboundChannel 注册。这会填充 SecurityContextHolder,其中包含在 Message 中找到的用户。

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

  • 确保 CsrfChannelInterceptor 已向 clientInboundChannel 注册。这确保只能启用来自原始域的请求。

  • 确保 CsrfTokenHandshakeInterceptor 已向 WebSocketHttpRequestHandler、TransportHandlingSockJsService 或 DefaultSockJsService 注册。这确保将来自 HttpServletRequest 的预期的 CsrfToken 复制到 WebSocket 会话属性。

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

<websocket-message-broker> Attributes

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

  • *same-origin-disabled*禁用要求 CSRF 令牌出现在 Stomp 标头中(默认值为 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 结合使用时受支持)

Child Elements of <websocket-message-broker>

<intercept-message>

为消息定义授权规则。

Parent Elements of <intercept-message>

<intercept-message> Attributes

  • pattern*与 Message 目标匹配的基于 ant 的模式。例如,“/" matches any Message with a destination; "/admin/”与目标以“/admin/*”开头的任何 Message 匹配。

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

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