WebSocket Security

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

Spring Security 4.0+ 提供了对 message 授权的支持。这方面的一个具体例子是在基于WebSocket的应用程序中提供授权。

<websocket-message-broker>

websocket-message-broker 元素有两种不同的模式。如果没有指定 websocket-message-broker@id,那么它将做以下事情。

  • 确保任何 SimpAnnotationMethodMessageHandler 都将 AuthenticationPrincipalArgumentResolver 注册为一个自定义参数解析器。这允许使用 @AuthenticationPrincipal 来解决当前 AuthenticationPrincipal 的问题。

  • 确保 SecurityContextChannelInterceptorclientInboundChannel 自动注册。这使得 SecurityContextHolder 填充了在 Message 中发现的用户。

  • 确保一个 ChannelSecurityInterceptor 被注册在 clientInboundChannel 上。这允许为一个message指定授权规则。

  • 确保一个 CsrfChannelInterceptor 被注册到 clientInboundChannel。这确保只有来自原域的请求被启用。

  • 确保 CsrfTokenHandshakeInterceptorWebSocketHttpRequestHandlerTransportHandlingSockJsServiceDefaultSockJsService 注册。这确保来自 HttpServletRequest 的预期 CsrfToken 被复制到 WebSocket Session 属性(attribute)中。

如果需要额外的控制,可以指定ID,一个 ChannelSecurityInterceptor 将被分配给指定的ID。然后,所有与Spring的 message 传递基础设施的连接都可以手动完成。这样做比较麻烦,但对配置的控制力更强。

<websocket-message-broker> 属性

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

  • same-origin-disabled 禁止在Stomp header 文件中出现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>

定义了一个 message 的授权规则。

<intercept-message> 的父元素

<intercept-message> 属性

  • pattern An ant based pattern that matches on the Message 一个基于An的pattern,与消息的目的地相匹配。例如,/ 匹配任何有目的地的消息;/admin/ 匹配任何目的地以 /admin/** 开头的消息。

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

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