Spring Security: пользовательский RequestEntityConverter с несколькими клиентами

Я работал над тем, чтобы поток учетных данных клиента с Auth0 работал с использованием Spring Security 5.4.1. Я создал небольшое демонстрационное приложение для справки: https://github.com/mathias-ewald/spring-security-auth0-clientcredentials-demo

Все работает нормально, но мне было интересно, как обращаться с несколькими клиентами OAuth2. Насколько я понимаю, конфигурация сделана в OAuth2ClientSecurityConfig действителен для всех потоков учетных данных клиента к любому поставщику, верно?

Что, если у меня есть другой провайдер и я не хочу преобразовывать RequestEntity таким же образом?


person user3235738    schedule 24.11.2020    source источник


Ответы (1)


Обычно нет идеального ответа для мультитенантности, поскольку многое зависит от того, насколько рано в запросе вы хотите разветвить поведение.

В поддержке клиента OAuth 2.0 Spring Security ClientRegistration является арендатором, и информация об этом арендаторе доступна в большинстве клиентских API.

Например, ваш Auth0RequestEntityConverter может иметь другое поведение в зависимости от ClientRegistration в запросе:

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);
    }
}
person jzheaux    schedule 24.11.2020