Spring Security WebSocket 支持预览

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

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

简介

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

问题是授权仅限于握手阶段。 这意味着一旦建立连接,就无法为 WebSocket 应用程序的授权提供任何粒度。

使用 Spring Security 的消息传递支持

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

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

[callout title=直接 JSR-356 支持]我们一直在考虑直接与 JSR-356 集成。 然而,目前这非常困难,因为 JSR-356 非常底层,目前没有提供必要的抽象。[/callout]

这将确保

  • 任何用户都可以访问 /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 如何缓解这些问题。

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

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部