# WebSocket 安全

Spring Security4.0+ 为授权消息提供了支持。这一点很有用的一个具体例子是在基于 WebSocket 的应用程序中提供授权。

## \<websocket-message-broker\>

WebSocket-message-broker 元素有两种不同的模式。如果没有指定[[[email protected]]（#NSA- WebSocket-message-broker-id），那么它将执行以下操作：

* 确保任何 SimpAnnotationMethodMessageHandler 都将身份验证原则 argumentResolver 注册为自定义参数解析器。这允许使用`@AuthenticationPrincipal`来解析当前`Authentication`的主体

* 确保 SecurityContextChannelInterceptor 已自动注册为 ClientBoundChannel。这将用消息中找到的用户填充 SecurityContextholder

* 确保通道安全拦截器已在客户端 BoundChannel 中注册。这允许为消息指定授权规则。

* 确保一个 CSRFChannelInterceptor 已在 ClientInboundChannel 中注册。这确保只启用来自原始域的请求。

* 确保 CSRFTokenhandShakeInterceptor 已注册到 WebSockettPrequesthandler、TransportHandlingSockJSService 或 DefaultSockJSService。这确保了预期的来自 HttpServletRequest 的 CSRFToken 被复制到 WebSocket 会话属性中。

如果需要额外的控制，可以指定 ID，并将为指定的 ID 分配一个通道 SecurityInterceptor。然后，所有与 Spring 的消息传递基础设施的连接都可以手动完成。这比较麻烦，但提供了对配置的更大控制。

### \<websocket-message-broker\>属性

* **身份证**一个 Bean 标识符，用于在上下文的其他地方引用 ChannelSecurityInterceptor Bean。如果指定了， Spring 安全性要求在 Spring 消息传递中进行显式配置。如果没有指定， Spring 安全性将自动与消息传递基础设施集成，如[\<websocket-message-broker\>](#nsa-websocket-message-broker)中所述

* **同源禁用**禁用在 stomp 标头中存在的 CSRF 令牌的要求（默认为 false）。如果有必要允许其他来源建立 Sockjs 连接，那么更改默认值是有用的。

### \<websocket-message-broker\>的子元素

* [表达式处理程序](http.html#nsa-expression-handler)

* [截取消息](#nsa-intercept-message)

## \<intercept-message\>

为消息定义授权规则。

### \<intercept-message\>的父元素

* [websocket-message-broker](#nsa-websocket-message-broker)

### \<intercept-message\>属性

* **模式**一种基于 Ant 的模式，它在消息目标上匹配。例如，“/**”匹配带有目的地的任何消息；“/admin/**”匹配带有以“/admin/\***”开头的目的地的任何消息。

* **类型**要匹配的消息类型。有效的值在 SimpMessageType 中定义（即 Connect、Connect\_ack、heartbeat、Message、Subscribe、Unsubscribe、Disconnect、Disconnect\_ack、Other）。

* **访问**用于保护消息的表达式。例如，“denyall”将拒绝对所有匹配消息的访问；“permitall”将授予对所有匹配消息的访问权限；"HasRole（’admin’）要求当前用户拥有用于匹配消息的角色’role\_admin’。

[LDAP 安全性](ldap.html)[FAQ](../faq.html)

