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
的问题。 -
确保
SecurityContextChannelInterceptor
为clientInboundChannel
自动注册。这使得SecurityContextHolder
填充了在Message
中发现的用户。 -
确保一个
ChannelSecurityInterceptor
被注册在clientInboundChannel
上。这允许为一个message指定授权规则。 -
确保一个
CsrfChannelInterceptor
被注册到clientInboundChannel
。这确保只有来自原域的请求被启用。 -
确保
CsrfTokenHandshakeInterceptor
与WebSocketHttpRequestHandler
、TransportHandlingSockJsService
或DefaultSockJsService
注册。这确保来自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连接,改变默认值是很有用的。
-
security-context-holder-strategy-ref 使用该
SecurityContextHolderStrategy
(注意只支持与AuthorizationManager
API结合使用)。
<intercept-message>
定义了一个 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' 的角色。