WebSocket 安全
Spring Security 4.0+ 提供对授权消息的支持。一个具体的示例是为基于 WebSocket 的应用程序提供授权。
<websocket-message-broker>
websocket-message-broker 元素有两种不同的模式。如果未指定 websocket-message-broker@id,则它将执行以下操作
-
确保任何 SimpAnnotationMethodMessageHandler 都将 AuthenticationPrincipalArgumentResolver 注册为自定义参数解析器。这允许使用
@AuthenticationPrincipal
来解析当前Authentication
的主体 -
确保 SecurityContextChannelInterceptor 自动注册到 clientInboundChannel。这将使用在消息中找到的用户填充 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 连接时很有用。
-
security-context-holder-strategy-ref 使用此
SecurityContextHolderStrategy
(注意,仅在与AuthorizationManager
API 结合使用时才受支持)
<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" 角色。