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 连接,则更改默认设置非常有用。
-
*security-context-holder-strategy-ref*使用此
SecurityContextHolderStrategy
(请注意,仅与 `AuthorizationManager`API 结合使用时受支持)
<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”角色。