此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
Token 鉴权
Spring Security OAuth 支持基于令牌的安全性,包括 JSON Web 令牌 (JWT)。 您可以将其用作 Web 应用程序中的身份验证机制。 包括 WebSocket 交互上的 STOMP,如前面的 部分(即,通过基于 Cookie 的会话维护身份)。
同时,基于 Cookie 的会话并不总是最合适的(例如, 在不维护服务器端会话的应用程序中或在 移动应用程序,其中通常使用 Headers 进行身份验证)。
WebSocket 协议 RFC 6455“没有规定服务器在 WebSocket 握手。但是,在实践中,浏览器客户端只能使用标准的 authentication headers (即基本 HTTP authentication) 或 cookie 和 cannot (例如) 提供自定义标头。同样,Sockjs JavaScript 客户端也不提供 一种使用 Sockjs 传输请求发送 HTTP 标头的方法。参见 sockjs-client 问题 196。 相反,它确实允许发送可用于发送令牌的查询参数。 但这也有其自身的缺点(例如,令牌可能会无意中 使用服务器日志中的 URL 记录)。
上述限制适用于基于浏览器的客户端,不适用于 Spring 基于 Java 的 STOMP 客户端,它确实支持使用 WebSocket 和 Sockjs 请求。 |
因此,希望避免使用 cookie 的应用程序可能没有任何好处 HTTP 协议级别的身份验证替代方案。不使用 cookie, 他们可能更喜欢在 STOMP 消息传递协议级别使用 Headers 进行身份验证。 执行此作需要两个简单的步骤:
-
使用 STOMP 客户端在连接时传递身份验证标头。
-
使用
ChannelInterceptor
.
下一个示例使用服务器端配置来注册自定义身份验证
拦截 器。请注意,拦截器只需要进行身份验证并将
CONNECT 上的 user 标头Message
.Spring 记录并保存经过身份验证的
用户,并将其与同一会话上的后续 STOMP 消息相关联。以下内容
示例展示了如何注册自定义身份验证侦听器:
@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 的消息授权时,目前,
您需要确保身份验证ChannelInterceptor
config 已排序
领先于 Spring Security 的。最好通过在
它自己的WebSocketMessageBrokerConfigurer
标有@Order(Ordered.HIGHEST_PRECEDENCE + 99)
.