Spring Security WebSocket 支持预览

工程 | Rob Winch | 2014年8月21日 | ...

[信息框 title=2014年12月11日更新]虽然最初是关于 Spring Security 4.0.0.M2 的,但博客已更新以反映 Spring Security 4.0 RC1 中发现的改进。[/信息框]

简介

以前,应用程序可以使用 Spring Security 在 WebSocket 应用程序中执行身份验证。这是可行的,因为 `HttpServletRequest` 的 `Principal` 将传播到 WebSocket 会话。

问题是授权仅限于握手。这意味着一旦建立连接,就无法对 WebSocket 应用程序的授权进行任何细粒度的控制。

使用 Spring Security 的消息支持

Spring Security 4.0.0.RC2 通过 Spring Messaging 抽象引入了对 WebSocket 的授权支持。要提供授权,只需扩展 `AbstractSecurityWebSocketMessageBrokerConfigurer` 并配置 `MessageSecurityMetadataSourceRegistry`。例如

public class WebSocketSecurityConfig extends
          AbstractSecurityWebSocketMessageBrokerConfigurer {
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
      messages
        . simpDestMatchers("/user/queue/errors").permitAll()
        . simpDestMatchers("/**").hasRole("ADMIN");
      }
  }

[信息框 title=直接 JSR-356 支持]我们考虑过直接与 JSR-356 集成。但是,目前这非常困难,因为 JSR-356 级别非常低,并且目前没有提供必要的抽象。[/信息框]

这将确保:

  • `/user/queue/errors` 目的地可以被任何用户访问
  • 任何其他包含目的地头的消息只能被具有 `ROLE_ADMIN` 角色的用户访问

XML 命名空间支持

类似地,我们可以使用 Spring Security XML 命名空间支持来定义上述配置。等效配置如下:

<websocket-message-broker>
    <!-- pattern matches on the destination header -->
    <intercept-message pattern="/user/queue/errors" access="permitAll" />
    <intercept-message pattern="/**" access="hasRole('ROLE_ADMIN')" />
</websocket-message-broker>

方法安全和 WebSockets

我们还可以将方法安全与 WebSockets 一起使用。例如,以下方法只能由具有 `ROLE_ADMIN` 角色的用户调用:

	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@MessageMapping("/trade")
	public void executeTrade(Trade trade, Principal principal) {

示例应用程序

您可以在 rwinch/spring-websocket-portfolio 的 security 分支中找到授权的完整示例。

下一步是什么?

虽然这解决了我们的授权问题,但我们仍然缺少一个良好的机制来在通过 WebSockets 发送消息时保持我们的 `HttpSession` 活动。在下一篇文章中,我将更详细地讨论这些问题以及 Spring Session 如何缓解这些问题。

[信息框 title=SpringOne 2GX 2014 即将到来]尽快预订您在德克萨斯州达拉斯参加 9月8日至11日的 SpringOne 的位置。这是了解所有最新动态并提供直接反馈的最佳机会。从 0 到 Spring Security 4.0 会议将包含有关如何开始使用 Spring Security 的详细信息,并深入探讨 Spring Security 4 中的新功能。当然,还有许多其他令人兴奋的 Spring 相关演讲![/信息框]

获取 Spring 电子简讯

通过 Spring 电子简讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部