Spring Cloud поддержка Azure для Spring Security

Эта статья относится к: ✔️ версия 4.14.0 ✔️ версии 5.8.0

В этой статье описывается, как azure Spring Cloud и Spring Security можно использовать вместе.

Spring Security с идентификатором Microsoft Entra

При создании веб-приложения управление удостоверениями и доступом всегда будет основными частями.

Azure предлагает отличную платформу для демократизации процесса разработки приложений, так как она предлагает не только облачную службу удостоверений, но и глубокую интеграцию с остальной частью экосистемы Azure.

Spring Security упрощает защиту приложений Spring на основе Spring с помощью мощных абстракций и расширяемых интерфейсов. Тем не менее, так же мощный, как платформа Spring, может быть, она не адаптирована к конкретному поставщику удостоверений.

Предоставляет spring-cloud-azure-starter-active-directory наиболее оптимальный способ подключения веб-приложения к клиенту Microsoft Entra ID (Идентификатор Microsoft Entra ID для короткого) и защитить сервер ресурсов с помощью идентификатора Microsoft Entra. Для защиты веб-приложений и серверов ресурсов в этом наборе используется протокол OAuth 2.0.

Доступ к веб-приложению

В этом сценарии поток предоставления кода авторизации OAuth 2.0 используется для входа пользователя с учетной записью Майкрософт.

Системная схема

System diagram for a standalone web application.

Создание необходимых ресурсов в Azure

  1. Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.

  2. Создайте регистрацию приложения. Получение AZURE_TENANT_ID, AZURE_CLIENT_IDи AZURE_CLIENT_SECRET.

  3. Задайте значение redirect URIAPPLICATION_BASE_URI/login/oauth2/code/ — например http://localhost:8080/login/oauth2/code/. Требуется хвост./

Добавление необходимых зависимостей

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Добавление обязательных свойств

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Теперь запустите приложение и получите доступ к приложению через браузер. Вы будете перенаправлены на страницу входа Майкрософт.

Дополнительные сведения об использовании

Добавление дополнительных конфигураций безопасности
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {

    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .anyRequest().authenticated();
        // Do some custom configuration
    }
}
Авторизация доступа по ролям приложений

Создайте необходимые ресурсы в Azure:

Примечание.

Если вы хотите использовать управление доступом на основе ролей приложения, вы не можете поместить имена групп в role утверждение. Дополнительные сведения см. в разделе "Настройка групп необязательных утверждений" раздела "Предоставление необязательных утверждений для приложения".

Защита конкретного метода.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Авторизация доступа по имени группы или идентификатору группы

Добавьте связанные свойства конфигурации.

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       user-group:
         allowed-group-names: group1_name_1, group2_name_2
         # 1. If allowed-group-ids == all, then all group ID will take effect.
         # 2. If "all" is used, we should not configure other group ids.
         # 3. "all" is only supported for allowed-group-ids, not supported for allowed-group-names.
         allowed-group-ids: group_id_1, group_id_2

Защита конкретного метода.

@Controller
public class RoleController {
   @GetMapping("group1")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_group1')")
   public String group1() {
       return "group1 message";
   }

   @GetMapping("group2")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_group2')")
   public String group2() {
       return "group2 message";
   }

   @GetMapping("group1Id")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_<group1-id>')")
   public String group1Id() {
       return "group1Id message";
   }

   @GetMapping("group2Id")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_<group2-id>')")
   public String group2Id() {
       return "group2Id message";
   }
}
Использование Национальной Azure вместо глобальной azure

Теперь, кроме глобального облака Azure, идентификатор Microsoft Entra развертывается в следующих национальных облаках:

  • Azure для государственных организаций

  • Azure China 21Vianet

  • Azure для Германии

Ниже приведен пример использования Azure China 21Vianet.

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        base-uri: https://login.partner.microsoftonline.cn
        graph-base-uri: https://microsoftgraph.chinacloudapi.cn

Дополнительные сведения см. в разделе "Национальные облачные развертывания".

Настройка шаблона URI перенаправления

Разработчики могут настроить URI перенаправления.

System diagram for redirect URIs.

Добавьте redirect-uri-template свойства в файл application.yml .

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       redirect-uri-template: ${REDIRECT-URI-TEMPLATE}

Обновите redirect-uri портал Azure.

Configure Redirect URI Template.

После установки redirect-uri-templateнеобходимо обновить построитель безопасности:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.oauth2Login()
                .loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
                .and()
            .authorizeRequests()
                .anyRequest().authenticated();
    }
}

Подключение идентификатор Microsoft Entra с помощью прокси-сервера

Чтобы подключить идентификатор Microsoft Entra через прокси-сервер, укажите RestTemplateCustomizer боб, как показано в следующем примере:

@Configuration
class DemoConfiguration {
    @Bean
    public RestTemplateCustomizer proxyRestTemplateCustomizer() {
        return (RestTemplate restTemplate) -> {
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
            SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
            requestFactory.setProxy(proxy);
            restTemplate.setRequestFactory(requestFactory);
        };
    }
}

Примеры

Пример проекта: aad-web-application.

Веб-приложение, обращающееся к серверам ресурсов

Системная схема

System diagram for a web application accessing resource servers.

Создание необходимых ресурсов в Azure

  1. Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.

  2. Создайте регистрацию приложения. Получение AZURE_TENANT_ID, AZURE_CLIENT_IDи AZURE_CLIENT_SECRET.

  3. Задайте значение redirect URIAPPLICATION_BASE_URI/login/oauth2/code/, например http://localhost:8080/login/oauth2/code/. Требуется хвост./

Добавление необходимых зависимостей

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Добавление обязательных свойств

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          graph:
            scopes: https://graph.microsoft.com/Analytics.Read, email

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Ниже приведено имя OAuth2AuthorizedClient, scopes означает, graph что область, необходимые для согласия при входе.

Использование OAuth2AuthorizedClient в приложении

public class Demo {
    @GetMapping("/graph")
    @ResponseBody
    public String graph(
    @RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient) {
        // toJsonString() is just a demo.
        // oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.
        return toJsonString(graphClient);
    }
}

Теперь запустите приложение и получите доступ к приложению в браузере. Затем вы будете перенаправлены на страницу входа Майкрософт.

Дополнительные сведения об использовании

Поток учетных данных клиента

Поток кода авторизации по умолчанию — это поток кода авторизации, если вы хотите использовать поток учетных данных клиента, можно настроить следующим образом:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          graph:
            authorization-grant-type: client_credentials # Change type to client_credentials
            scopes: https://graph.microsoft.com/Analytics.Read, email

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Доступ к нескольким серверам ресурсов

В одном веб-приложении можно получить доступ к нескольким серверам ресурсов, настроив следующее:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          resource-server-1:
            scopes: # Scopes for resource-server-1
          resource-server-2:
            scopes: # Scopes for resource-server-2

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Затем вы можете использовать OAuth2AuthorizedClient в приложении, как это

public class Demo {
    @GetMapping("/resource-server-1")
    @ResponseBody
    public String graph(
    @RegisteredOAuth2AuthorizedClient("resource-server-1") OAuth2AuthorizedClient client) {
        return callResourceServer1(client);
    }

    @GetMapping("/resource-server-2")
    @ResponseBody
    public String graph(
    @RegisteredOAuth2AuthorizedClient("resource-server-2") OAuth2AuthorizedClient client) {
        return callResourceServer2(client);
    }
}

Примеры

Пример проекта: aad-web-application.

Доступ к серверу ресурсов

Этот сценарий не поддерживает вход, просто защищает сервер, проверяя маркер доступа. Если маркер доступа действителен, сервер обрабатывает запрос.

Системная схема

System diagram for standalone resource server usage.

Создание необходимых ресурсов в Azure

  1. Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.

  2. Создайте регистрацию приложения. Получить AZURE_CLIENT_ID.

  3. Краткое руководство. Настройка приложения для предоставления веб-API.

  4. Предоставление веб-API с именем Scope-1область.

Добавление необходимых зависимостей

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
</dependencies>

Добавление обязательных свойств

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: ${AZURE_CLIENT_ID}

Теперь запустите приложение и получите доступ к веб-API приложения.

  1. Вы получите 401 без маркера доступа.

  2. Доступ к приложению с помощью маркера доступа. Будут проверены следующие утверждения в маркере доступа:

    • iss: маркер доступа должен быть выдан идентификатором Microsoft Entra.

    • nbf: текущее время не может быть раньше nbf.

    • exp: текущее время не может быть после exp.

    • aud: если spring.cloud.azure.active-directory.credential.client-id или настроены, аудитория должна быть равна настроенной или spring.cloud.azure.active-directory.credential.app-id-uriapp-id-uri.client-id Если два свойства не настроены, это утверждение не будет проверено.

Дополнительные сведения о маркере доступа см. в документации MS по платформа удостоверений Майкрософт маркерам доступа.

Дополнительные сведения об использовании

Добавление дополнительных конфигураций безопасности
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {
    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
    }
}
Проверка разрешений по область
  1. Создайте необходимые ресурсы в Azure.

  2. Защита конкретного метода.

    class Demo {
        @GetMapping("scope1")
        @ResponseBody
        @PreAuthorize("hasAuthority('SCOPE_Scope1')")
        public String scope1() {
            return "Congratulations, you can access `scope1` endpoint.";
        }
    }
    

При этом при доступе /scope1 к конечной точке будут проверены следующие утверждения в маркере доступа:

  • scp: значение должно содержать Scope1.
Проверка разрешений по ролям приложений
  1. Создайте необходимые ресурсы в Azure.

  2. Защита конкретного метода.

    class Demo {
        @GetMapping("app-role1")
        @ResponseBody
        @PreAuthorize("hasAuthority('APPROLE_AppRole1')")
        public String appRole1() {
            return "Congratulations, you can access `app-role1` endpoint.";
        }
    }
    

При этом при доступе /app-role1 к конечной точке будут проверены следующие утверждения в маркере доступа:

  • roles: значение должно содержать AppRole1.
Использование проверки подлинности клиента JWT

Чтобы использовать веб-токен JSON (JWT) для проверки подлинности клиента, выполните следующие действия.

  1. Ознакомьтесь с разделом "Регистрация сертификата с помощью платформа удостоверений Майкрософт" платформа удостоверений Майкрософт учетных данных сертификата проверки подлинности приложения.
  2. Отправьте pem-сертификат в приложение, зарегистрированное в портал Azure.
  3. Настройте путь к сертификату и пароль объекта . PFX или . Сертификат P12 .
  4. Добавьте конфигурацию свойства spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt клиенту для проверки подлинности с помощью проверки подлинности клиента JWT.

В следующем примере файла конфигурации используется сценарий веб-приложения. Сведения о сертификате настраиваются в глобальных свойствах.

spring:
  cloud:
    azure:
      credential:
        client-id: ${AZURE_CLIENT_ID}
        client-certificate-path: ${AZURE_CERTIFICATE_PATH}
        client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
      profile:
        tenant-id: <tenant>
      active-directory:
        enabled: true
        user-group:
          allowed-group-names: group1,group2
          allowed-group-ids: <group1-id>,<group2-id>
        post-logout-redirect-uri: http://localhost:8080
        authorization-clients:
          azure:
            client-authentication-method: private_key_jwt
          arm:
            client-authentication-method: private_key_jwt
            scopes: https://management.core.windows.net/user_impersonation
          graph:
            client-authentication-method: private_key_jwt
            scopes:
              - https://graph.microsoft.com/User.Read
              - https://graph.microsoft.com/Directory.Read.All
          webapiA:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
          webapiB:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_B_APP_ID_URL}/.default
            authorization-grant-type: client_credentials

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Вы также можете настроить сведения о сертификате active-directory в свойствах службы, как показано в этом примере:

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-certificate-path: ${AZURE_CERTIFICATE_PATH}
          client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
        profile:
          tenant-id: <tenant>
        user-group:
          allowed-group-names: group1,group2
          allowed-group-ids: <group1-id>,<group2-id>
        post-logout-redirect-uri: http://localhost:8080
        authorization-clients:
          azure:
            client-authentication-method: private_key_jwt
          arm:
            client-authentication-method: private_key_jwt
            scopes: https://management.core.windows.net/user_impersonation
          graph:
            client-authentication-method: private_key_jwt
            scopes:
              - https://graph.microsoft.com/User.Read
              - https://graph.microsoft.com/Directory.Read.All
          webapiA:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
          webapiB:
            client-authentication-method: private_key_jwt
            scopes:
              - ${WEB_API_B_APP_ID_URL}/.default
            authorization-grant-type: client_credentials

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Подключение идентификатор Microsoft Entra с помощью прокси-сервера

Чтобы подключить идентификатор Microsoft Entra через прокси-сервер, предоставьте RestTemplateCustomizer bean. Дополнительные сведения см. в разделе "Подключение ing to Microsoft Entra ID" с помощью раздела прокси-сервера.

Примеры

Пример проекта: aad-resource-server.

Сервер ресурсов, посещая другие серверы ресурсов

Системная схема

System diagram for a resource server visiting other resource servers.

Создание необходимых ресурсов в Azure

  1. Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.

  2. Создайте регистрацию приложения. Получение AZURE_TENANT_ID, AZURE_CLIENT_IDи AZURE_CLIENT_SECRET.

Добавление необходимых зависимостей

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Добавление обязательных свойств

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        authorization-clients:
          graph:
            scopes:
              - https://graph.microsoft.com/User.Read

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Использование OAuth2AuthorizedClient в приложении

public class SampleController {
    @GetMapping("call-graph")
    public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
        return callMicrosoftGraphMeEndpoint(graph);
    }
}

Примеры

Пример проекта: aad-resource-server-obo.

Веб-приложение и сервер ресурсов в одном приложении

Создание необходимых ресурсов в Azure

  1. Краткое руководство. Регистрация приложения с помощью платформа удостоверений Майкрософт.

  2. Создайте регистрацию приложения. Получение AZURE_TENANT_ID, AZURE_CLIENT_IDи AZURE_CLIENT_SECRET.

Добавление необходимых зависимостей

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

Добавление обязательных свойств

Задайте для свойства значение spring.cloud.azure.active-directory.application-typeweb_application_and_resource_serverи укажите тип авторизации для каждого клиента авторизации.

spring:
  cloud:
    azure:
      active-directory:
        enabled: true
        profile:
          tenant-id: <tenant>
        credential:
          client-id: ${AZURE_CLIENT_ID}
          client-secret: ${AZURE_CLIENT_SECRET}
        app-id-uri: ${WEB_API_ID_URI}
        application-type: web_application_and_resource_server  # This is required.
        authorization-clients:
          graph:
            authorizationGrantType: authorization_code # This is required.
            scopes:
              - https://graph.microsoft.com/User.Read
              - https://graph.microsoft.com/Directory.Read.All

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Определение securityFilterChain

Настройка нескольких SecurityFilterChain экземпляров. AadWebApplicationAndResourceServerConfig содержит две конфигурации цепочки фильтров безопасности для сервера ресурсов и веб-приложения.

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadWebApplicationAndResourceServerConfig {

    @Order(1)
    @Configuration
    public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
            // All the paths that match `/api/**`(configurable) work as `Resource Server`, other paths work as `Web application`.
            http.antMatcher("/api/**")
                .authorizeRequests().anyRequest().authenticated();
        }
    }

    @Configuration
    public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
            // @formatter:off
            http.authorizeRequests()
                    .antMatchers("/login").permitAll()
                    .anyRequest().authenticated();
            // @formatter:on
        }
    }
}

Настройка

Настраиваемые свойства spring-cloud-azure-starter-active-directory:

Имя Описание
spring.cloud.azure.active-directory.app-id-uri URI идентификатора приложения, который может использоваться в утверждении "aud" id_token.
spring.cloud.azure.active-directory.application-type Тип приложения Microsoft Entra.
spring.cloud.azure.active-directory.authenticate-additional-parameters Добавьте дополнительные параметры в URL-адрес авторизации.
spring.cloud.azure.active-directory.authorization-client Клиенты авторизации OAuth2.
spring.cloud.azure.active-directory.credential.client-id Идентификатор клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure.
spring.cloud.azure.active-directory.credential.client-secret Секрет клиента, используемый при выполнении проверки подлинности субъекта-службы с помощью Azure.
spring.cloud.azure.active-directory.jwk-set-cache-жизни Срок действия кэшированного набора JWK до истечения срока действия по умолчанию составляет 5 минут.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time Время обновления кэшированного набора JWK до истечения срока действия по умолчанию составляет 5 минут.
spring.cloud.azure.active-directory.jwt-connect-timeout время ожидания Подключение для вызова удаленного URL-адреса JWKSet.
spring.cloud.azure.active-directory.jwt-read-timeout Время ожидания чтения для вызова удаленного URL-адреса JWKSet.
spring.cloud.azure.active-directory.jwt-size-limit Ограничение размера в байтах вызова удаленного URL-адреса JWKSet.
spring.cloud.azure.active-directory.post-logout-redirect-uri URI перенаправления после выхода.
spring.cloud.azure.active-directory.profile.cloud-type Имя облака Azure для подключения. Поддерживаемые типы: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.
spring.cloud.azure.active-directory.profile.environment Свойства конечных точек Microsoft Entra.
spring.cloud.azure.active-directory.profile.tenant-id Идентификатор клиента Azure. Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента.
spring.cloud.azure.active-directory.redirect-uri-template Конечная точка перенаправления: используется сервером авторизации для возврата ответов, содержащих учетные данные авторизации клиенту с помощью агента пользователя-владельца ресурса. Значение по умолчанию — {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map Настройте утверждение, которое будет использоваться для сборки GrantedAuthority и префикса строкового значения GrantedAuthority. Значение по умолчанию: "scp" -> "SCOPE_", "роли" -> "APPROLE_".
spring.cloud.azure.active-directory.resource-server.principal-claim-name Настройте утверждение в маркере доступа, возвращаемое в authenticationdPrincipal#getName. Значение по умолчанию — sub.
spring.cloud.azure.active-directory.session-stateless Если значение true активирует фильтр проверки подлинности без отслеживания состояния AadAppRoleStatlessAuthenticationFilter. Значение по умолчанию равно false, которое активирует AadAuthenticationFilter.
spring.cloud.azure.active-directory.user-group.allowed-group-ids Идентификаторы группы можно использовать для создания GrantedAuthority.
spring.cloud.azure.active-directory.user-group.allowed-group-group-name Имена групп можно использовать для создания GrantedAuthority.
spring.cloud.azure.active-directory.user-group.use-transitive-members Если значение true, используйте команду "v1.0/me/transitiveMemberOf", чтобы получить элементы. В противном случае используйте "v1.0/me/memberOf". Значение по умолчанию — false.
spring.cloud.azure.active-directory.user-name-attribute Определите, какое утверждение должно быть именем участника.

Ниже приведены некоторые примеры использования этих свойств:

Тип приложения

Тип приложения можно вывести из зависимостей: spring-security-oauth2-client или spring-security-oauth2-resource-server. Если вычисленное значение не является нужным значением, можно указать тип приложения. Ниже приведена таблица допустимых значений и выводимых значений:

Тип spring-cloud-azure-starter-active-directoryприложения:

Имеет зависимость: spring-security-oauth2-client Имеет зависимость: spring-security-oauth2-resource-server Допустимые значения типа приложения Выводимое значение
Да No web_application web_application
No Да resource_server resource_server
Да Да web_application, resource_server, resource_server_with_obo, web_application_and_resource_server resource_server_with_obo

Spring Security с azure Active Directory B2C

Azure Active Directory (Azure AD) B2C — это служба управления идентификацией, которая позволяет настраивать и администрировать процессы входа и регистрации пользователей, а также управлять их профилями при использовании приложений. Azure AD B2C включает эти действия, обеспечивая безопасность пользовательских удостоверений.

Настройка зависимостей

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
    </dependency>
</dependencies>

Настройка

Настраиваемые свойства spring-cloud-azure-starter-active-directory-b2c:

Имя Описание
spring.cloud.azure.active-directory.b2c.app-id-uri URI идентификатора приложения, который может использоваться в утверждении aud маркера.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters Дополнительные параметры проверки подлинности.
spring.cloud.azure.active-directory.b2c.authorization-client Укажите конфигурацию клиента.
spring.cloud.azure.active-directory.b2c.base-uri Базовый uri конечной точки Azure AD B2C.
spring.cloud.azure.active-directory.b2c.credential Сведения о учетных данных Azure AD B2C.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout время ожидания Подключение для вызова удаленного URL-адреса JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout Время ожидания чтения для вызова удаленного URL-адреса JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-size-limit Ограничение размера в байтах вызова удаленного URL-адреса JWKSet.
spring.cloud.azure.active-directory.b2c.login-flow Укажите первичный ключ потока входа. Значение по умолчанию — sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url URL-адрес перенаправления после выхода. Значение по умолчанию — http://localhost:8080/login.
spring.cloud.azure.active-directory.b2c.profile Сведения о профиле Azure AD B2C.
spring.cloud.azure.active-directory.b2c.reply-url URL-адрес ответа после получения кода авторизации. Значение по умолчанию — {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flows Потоки пользователей.
spring.cloud.azure.active-directory.b2c.user-name-attribute-name Имя атрибута имени пользователя.

Для полных конфигураций проверка свойства конфигурации Spring Cloud Azure.

Базовое использование

Веб-приложение — это любое веб-приложение, позволяющее пользователю войти с помощью идентификатора Microsoft Entra, в то время как сервер ресурсов будет принимать или запрещать доступ после проверки access_token, полученного от идентификатора Microsoft Entra. В этом руководстве мы рассмотрим 4 сценария:

  1. Доступ к веб-приложению.

  2. Веб-приложение, обращающееся к серверам ресурсов.

  3. Доступ к серверу ресурсов.

  4. Сервер ресурсов, обращаюющийся к другим серверам ресурсов.

System diagram of web application interaction with Microsoft Entra ID and resource servers.

Использование 1. Доступ к веб-приложению

В этом сценарии поток предоставления кода авторизации OAuth 2.0 используется для входа пользователя с помощью пользователя Azure AD B2C.

Выберите Azure AD B2C в меню портала, выберите "Приложения" и нажмите кнопку "Добавить".

Укажите имя приложения (напримерwebapp, добавьте http://localhost:8080/login/oauth2/code/ URL-адрес ответа), запишите идентификатор приложения в качестве вашегоWEB_APP_AZURE_CLIENT_ID, а затем нажмите кнопку "Сохранить".

Выберите ключи из приложения, выберите "Создать ключ ", чтобы создать WEB_APP_AZURE_CLIENT_SECRET, а затем нажмите кнопку "Сохранить".

Выберите потоки пользователей слева и выберите новый поток пользователя.

Выберите "Регистрация" или "В", "Редактирование профиля" и "Сброс пароля", чтобы создать потоки пользователей соответственно. Укажите имя потока пользователя и атрибуты пользователя и утверждения, а затем нажмите кнопку "Создать".

Выберите разрешения>API " Добавить разрешения>Microsoft API", выберите Microsoft Graph, выберите делегированные разрешения, выберите offline_access и разрешения openid, а затем нажмите кнопку "Добавить разрешение" для завершения процесса.

Предоставьте согласие администратора для разрешений Graph.

Azure portal screenshot showing API permissions screen for an app, with graph permissions highlighted.

Добавьте приведенные ниже зависимости в файл pom.xml.

<dependencies>
   <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-thymeleaf</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
   </dependency>
   <dependency>
       <groupId>org.thymeleaf.extras</groupId>
       <artifactId>thymeleaf-extras-springsecurity5</artifactId>
   </dependency>
</dependencies>

Добавьте свойства в файл application.yml , используя созданные ранее значения, как показано в следующем примере:

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         authenticate-additional-parameters:
           domain_hint: xxxxxxxxx         # optional
           login_hint: xxxxxxxxx          # optional
           prompt: [login,none,consent]   # optional
         base-uri: ${BASE_URI}
         credential:
           client-id: ${WEBAPP_AZURE_CLIENT_ID}
           client-secret: ${WEBAPP_AZURE_CLIENT_SECRET}
         login-flow: ${LOGIN_USER_FLOW_KEY}               # default to sign-up-or-sign-in, will look up the user-flows map with provided key.
         logout-success-url: ${LOGOUT_SUCCESS_URL}
         user-flows:
           ${YOUR_USER_FLOW_KEY}: ${USER_FLOW_NAME}
         user-name-attribute-name: ${USER_NAME_ATTRIBUTE_NAME}

Напишите код Java.

Для кода контроллера можно ознакомиться со следующим примером:

@Controller
public class WebController {

   private void initializeModel(Model model, OAuth2AuthenticationToken token) {
       if (token != null) {
           final OAuth2User user = token.getPrincipal();
           model.addAllAttributes(user.getAttributes());
           model.addAttribute("grant_type", user.getAuthorities());
           model.addAttribute("name", user.getName());
       }
   }

   @GetMapping(value = { "/", "/home" })
   public String index(Model model, OAuth2AuthenticationToken token) {
       initializeModel(model, token);
       return "home";
   }
}

В коде конфигурации безопасности можно ознакомиться со следующим примером:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

   private final AadB2cOidcLoginConfigurer configurer;

   public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
       this.configurer == configurer;
   }

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       // @formatter:off
       http.authorizeRequests()
               .anyRequest().authenticated()
               .and()
           .apply(configurer);
       // @formatter:off
   }
}

Скопируйте home.html из примера приложения aad-b2c-web-application и замените PROFILE_EDIT_USER_FLOWPASSWORD_RESET_USER_FLOW имена потоков пользователя, которые вы использовали ранее.

Создание и тестирование приложения. Пусть запустите Webapp порт 8080.

После сборки и запуска приложения в Maven откройте в веб-браузере адрес http://localhost:8080/. Вы должны быть перенаправлены на страницу входа.

Выберите ссылку с потоком пользователя для входа. Вы перейдете на страницу Azure AD B2C, где можете начать проверку подлинности.

После успешного входа в систему вы увидите пример home page из браузера.

Использование 2. Доступ к серверам ресурсов веб-приложения

Этот сценарий основан на сценарии доступа к веб-приложению , чтобы разрешить приложению доступ к другим ресурсам. Этот сценарий — поток предоставления учетных данных клиента OAuth 2.0.

Выберите Azure AD B2C в меню портала, выберите "Приложения" и нажмите кнопку "Добавить".

Укажите имя приложения (напримерwebApiA), запишите идентификатор приложения в качестве вашегоWEB_API_A_AZURE_CLIENT_ID, а затем нажмите кнопку "Сохранить".

Выберите ключи из приложения, выберите "Создать ключ ", чтобы создать WEB_API_A_AZURE_CLIENT_SECRET, а затем нажмите кнопку "Сохранить".

Выберите "Предоставить API " в области навигации и выберите "Задать". Запишите URI идентификатора приложения в качестве вашегоWEB_API_A_APP_ID_URL, а затем нажмите кнопку "Сохранить".

Выберите манифест в области навигации и вставьте следующий сегмент JSON в appRoles массив. Запишите URI идентификатора приложения в качестве вашегоWEB_API_A_APP_ID_URL, запишите значение роли приложения в качестве вашейWEB_API_A_ROLE_VALUE, а затем нажмите кнопку "Сохранить".

{
 "allowedMemberTypes": [
   "Application"
 ],
 "description": "WebApiA.SampleScope",
 "displayName": "WebApiA.SampleScope",
 "id": "04989db0-3efe-4db6-b716-ae378517d2b7",
 "isEnabled": true,
 "value": "WebApiA.SampleScope"
}

Azure portal screenshot showing application manifest screen with appRoles JSON highlighted.

Выберите разрешения>API Add a permission>My API, select WebApiA application name, select Application Permissions, select Application Permissions, select WebApiA.SampleScope permission, and then add permission to complete the process.

Предоставьте согласие администратора для разрешений WebApiA.

Azure portal screenshot showing application API permissions screen.

Добавьте следующую зависимость на основе сценария доступа к веб-приложению .

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Добавьте следующую конфигурацию на основе сценария доступа к веб-приложению .

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         base-uri: ${BASE_URI}             # Such as: https://xxxxb2c.b2clogin.com
         profile:
           tenant-id: <tenant>
         authorization-clients:
           ${RESOURCE_SERVER_A_NAME}:
             authorization-grant-type: client_credentials
             scopes: ${WEB_API_A_APP_ID_URL}/.default

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Webapp Напишите код Java.

Для кода контроллера можно ознакомиться со следующим примером:

class Demo {
   /**
    * Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or
    * <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
    * DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
    *
    * @return Respond to protected data from WebApi A.
    */
   @GetMapping("/webapp/webApiA")
   public String callWebApiA() {
       String body = webClient
           .get()
           .uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)
           .attributes(clientRegistrationId("webApiA"))
           .retrieve()
           .bodyToMono(String.class)
           .block();
       LOGGER.info("Call callWebApiA(), request '/webApiA/sample' returned: {}", body);
       return "Request '/webApiA/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
   }
}

Код конфигурации безопасности совпадает с кодом в сценарии доступа к веб-приложению . Добавьте еще одну фасоль webClient следующим образом:

public class SampleConfiguration {
   @Bean
   public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
       ServletOAuth2AuthorizedClientExchangeFilterFunction function =
           new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
       return WebClient.builder()
                       .apply(function.oauth2Configuration())
                       .build();
   }
}

Сведения о написании WebApiA кода Java см. в разделе "Доступ к серверу ресурсов".

Создание и тестирование приложения. Запустите Webapp порт WebApiA8080 и 8081 соответственно. Webapp Запустите и WebApiA приложения. Вернитесь на домашнюю страницу после успешного входа. Затем вы можете получить WebApiA ответ http://localhost:8080/webapp/webApiA на ресурс.

Использование 3. Доступ к серверу ресурсов

Этот сценарий не поддерживает вход. Просто защитите сервер, проверяя маркер доступа, и, если он действителен, он обслуживает запрос.

Сведения о создании WebApiA разрешения см. в разделе "Использование 2: доступ к серверам ресурсов веб-приложений".

Добавьте разрешение и предоставьте WebApiA согласие администратора для веб-приложения.

Добавьте приведенные ниже зависимости в файл pom.xml.

<dependencies>
   <dependency>
       <groupId>com.azure.spring</groupId>
       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

Добавьте следующую конфигурацию.

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         base-uri: ${BASE_URI}             # Such as: https://xxxxb2c.b2clogin.com
         profile:
           tenant-id: <tenant>
         app-id-uri: ${APP_ID_URI}         # If you're using v1.0 token, configure app-id-uri for `aud` verification
         credential:
           client-id: ${AZURE_CLIENT_ID}           # If you're using v2.0 token, configure client-id for `aud` verification
         user-flows:
           sign-up-or-sign-in: ${SIGN_UP_OR_SIGN_IN_USER_FLOW_NAME}

Примечание.

Допустимые значенияtenant-id: common, organizationsconsumersили идентификатор клиента. Дополнительные сведения об этих значениях см. в разделе "Использована неправильная конечная точка (личные и учетные записи организации) в разделе "Ошибка" AADSTS50020 . Учетная запись пользователя от поставщика удостоверений не существует в клиенте. Сведения о преобразовании приложения с одним клиентом см. в разделе "Преобразование однотенантного приложения в мультитенантный" в идентификатор Microsoft Entra.

Напишите код Java.

Для кода контроллера можно ознакомиться со следующим примером:

class Demo {
   /**
    * webApiA resource api for web app
    * @return test content
    */
   @PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
   @GetMapping("/webApiA/sample")
   public String webApiASample() {
       LOGGER.info("Call webApiASample()");
       return "Request '/webApiA/sample'(WebApi A) returned successfully.";
   }
}

В коде конфигурации безопасности можно ознакомиться со следующим примером:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests((requests) -> requests.anyRequest().authenticated())
           .oauth2ResourceServer()
           .jwt()
               .jwtAuthenticationConverter(new AadJwtBearerTokenAuthenticationConverter());
   }
}

Создание и тестирование приложения. Давайте WebApiA запустите порт 8081. Получите маркер доступа для webApiA ресурса, а затем в http://localhost:8081/webApiA/sample качестве заголовка авторизации носителя.

Использование 4. Доступ к другим серверам ресурсов

Этот сценарий является обновлением доступа к серверу ресурсов и поддерживает доступ к другим ресурсам приложения на основе потока учетных данных клиента OAuth2.

Ссылаясь на предыдущие шаги, мы создадим WebApiB приложение и предоставляем разрешение WebApiB.SampleScopeприложения.

{
   "allowedMemberTypes": [
       "Application"
   ],
   "description": "WebApiB.SampleScope",
   "displayName": "WebApiB.SampleScope",
   "id": "04989db0-3efe-4db6-b716-ae378517d2b7",
   "isEnabled": true,
   "lang": null,
   "origin": "Application",
   "value": "WebApiB.SampleScope"
}

Azure portal screenshot showing application WebApiB manifest screen with appRoles JSON highlighted.

Предоставьте согласие администратора для WebApiB разрешений.

Azure portal screenshot showing application WebApiA API permissions screen.

На основе доступа к серверу ресурсов добавьте следующую зависимость в файл pom.xml .

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Добавьте следующую конфигурацию на основе конфигурации сервера ресурсов.

spring:
 cloud:
   azure:
     active-directory:
       b2c:
         enabled: true
         credential:
           client-secret: ${WEB_API_A_AZURE_CLIENT_SECRET}
         authorization-clients:
           ${RESOURCE_SERVER_B_NAME}:
             authorization-grant-type: client_credentials
             scopes: ${WEB_API_B_APP_ID_URL}/.default

Напишите код Java.

WebApiA Для кода контроллера можно ознакомиться со следующим примером:

public class SampleController {
   /**
    * Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
    * <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
    * DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
    *
    * @return Respond to protected data from WebApi B.
    */
   @GetMapping("/webApiA/webApiB/sample")
   @PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
   public String callWebApiB() {
       String body = webClient
           .get()
           .uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
           .attributes(clientRegistrationId("webApiB"))
           .retrieve()
           .bodyToMono(String.class)
           .block();
       LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
       return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
   }
}

WebApiB Для кода контроллера можно ознакомиться со следующим примером:

public class SampleController {
   /**
    * webApiB resource api for other web application
    * @return test content
    */
   @PreAuthorize("hasAuthority('APPROLE_WebApiB.SampleScope')")
   @GetMapping("/webApiB/sample")
   public String webApiBSample() {
       LOGGER.info("Call webApiBSample()");
       return "Request '/webApiB/sample'(WebApi B) returned successfully.";
   }
}

Код конфигурации безопасности совпадает с сценарием доступа к серверу ресурсов, добавляется другая бобовая группа webClient , как показано ниже.

public class SampleConfiguration {
   @Bean
   public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
       ServletOAuth2AuthorizedClientExchangeFilterFunction function =
           new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
       return WebClient.builder()
                       .apply(function.oauth2Configuration())
                       .build();
   }
}

Создание и тестирование приложения. Запустите WebApiA порт WebApiB8081 и 8082 соответственно. WebApiA Запустите и WebApiB приложения, получите маркер доступа для webApiA ресурса и получите доступ http://localhost:8081/webApiA/webApiB/sample в качестве заголовка авторизации носителя.

Примеры

Дополнительные сведения см. в примерах spring-cloud-azure-starter-active-directory-b2c.