Spring 安全性:具有多个客户端的自定义 RequestEntityConverter

Spring Security: Custom RequestEntityConverter with multiple clients

我正在努力让 Auth0 的客户端凭据流使用 Spring Security 5.4.1。我创建了一个小演示应用程序以供参考:https://github.com/mathias-ewald/spring-security-auth0-clientcredentials-demo

一切正常,但我想知道如何处理多个 OAuth2 客户端。据我了解,OAuth2ClientSecurityConfig 中的配置对流向任何提供商的所有客户端凭据均有效,对吗?

如果我有另一个提供者并且不想以相同的方式转换 RequestEntity 怎么办?

多租户通常没有完美的答案,因为很大程度上取决于您希望在请求中多早地分叉该行为。

在 Spring Security 的 OAuth 2.0 客户端支持中,ClientRegistration 是租户,租户信息在大多数客户端 API 中可用。

例如,根据请求中的 ClientRegistration,您的 Auth0RequestEntityConverter 可能会有不同的行为:

public RequestEntity<?> convert(
        OAuth2ClientCredentialsGrantRequest request) {
    ClientRegistration client = request.getClientRegistration();
    if (client ...) {
    } else if (client ...) {
    } ...
}

或者,如果您需要配置比请求实体转换器更多的东西,您可以通过为每个提供者构造一个 OAuth2AuthorizedClientManager 来更早地分叉行为:

public class ClientsOAuth2AuthorizedClientManager implements OAuth2AuthorizedClientManager {
    private final Map<String, OAuth2AuthorizedClientManager> managers;

    // ...

    public OAuth2AuthorizedClient authorize(OAuth2AuthorizeRequest request) {
        String clientRegistrationId = request.getClientRegistrationId();
        return this.managers.get(clientRegistrationId).authorize(request);
    }
}