对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

Token 鉴权

Spring Security OAuth 支持基于令牌的安全性,包括 JSON Web 令牌 (JWT)。 您可以将其用作 Web 应用程序中的身份验证机制。 包括 WebSocket 交互上的 STOMP,如前面的 部分(即,通过基于 Cookie 的会话维护身份)。spring-doc.cadn.net.cn

同时,基于 Cookie 的会话并不总是最合适的(例如, 在不维护服务器端会话的应用程序中或在 移动应用程序,其中通常使用 Headers 进行身份验证)。spring-doc.cadn.net.cn

WebSocket 协议 RFC 6455“没有规定服务器在 WebSocket 握手。但是,在实践中,浏览器客户端只能使用标准的 authentication headers (即基本 HTTP authentication) 或 cookie 和 cannot (例如) 提供自定义标头。同样,Sockjs JavaScript 客户端也不提供 一种使用 Sockjs 传输请求发送 HTTP 标头的方法。参见 sockjs-client 问题 196。 相反,它确实允许发送可用于发送令牌的查询参数。 但这也有其自身的缺点(例如,令牌可能会无意中 使用服务器日志中的 URL 记录)。spring-doc.cadn.net.cn

上述限制适用于基于浏览器的客户端,不适用于 Spring 基于 Java 的 STOMP 客户端,它确实支持使用 WebSocket 和 Sockjs 请求。

因此,希望避免使用 cookie 的应用程序可能没有任何好处 HTTP 协议级别的身份验证替代方案。不使用 cookie, 他们可能更喜欢在 STOMP 消息传递协议级别使用 Headers 进行身份验证。 执行此作需要两个简单的步骤:spring-doc.cadn.net.cn

  1. 使用 STOMP 客户端在连接时传递身份验证标头。spring-doc.cadn.net.cn

  2. 使用ChannelInterceptor.spring-doc.cadn.net.cn

下一个示例使用服务器端配置来注册自定义身份验证 拦截 器。请注意,拦截器只需要进行身份验证并将 CONNECT 上的 user 标头Message.Spring 记录并保存经过身份验证的 用户,并将其与同一会话上的后续 STOMP 消息相关联。以下内容 示例展示了如何注册自定义身份验证侦听器:spring-doc.cadn.net.cn

@Configuration
@EnableWebSocketMessageBroker
public class MyConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void configureClientInboundChannel(ChannelRegistration registration) {
		registration.interceptors(new ChannelInterceptor() {
			@Override
			public Message<?> preSend(Message<?> message, MessageChannel channel) {
				StompHeaderAccessor accessor =
						MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
				if (StompCommand.CONNECT.equals(accessor.getCommand())) {
					Authentication user = ... ; // access authentication header(s)
					accessor.setUser(user);
				}
				return message;
			}
		});
	}
}

另请注意,当您使用 Spring Security 的消息授权时,目前, 您需要确保身份验证ChannelInterceptorconfig 已排序 领先于 Spring Security 的。最好通过在 它自己的WebSocketMessageBrokerConfigurer标有@Order(Ordered.HIGHEST_PRECEDENCE + 99).spring-doc.cadn.net.cn