领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多[信息框 title=2014年12月11日更新]虽然最初是关于 Spring Security 4.0.0.M2 的,但博客已更新以反映 Spring Security 4.0 RC1 中发现的改进。[/信息框]
以前,应用程序可以使用 Spring Security 在 WebSocket 应用程序中执行身份验证。这是可行的,因为 `HttpServletRequest` 的 `Principal` 将传播到 WebSocket 会话。
问题是授权仅限于握手。这意味着一旦建立连接,就无法对 WebSocket 应用程序的授权进行任何细粒度的控制。
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 级别非常低,并且目前没有提供必要的抽象。[/信息框]
这将确保:
类似地,我们可以使用 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 一起使用。例如,以下方法只能由具有 `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 相关演讲![/信息框]