Udostępnij za pośrednictwem


Spring Cloud pomoc techniczna platformy Azure for Spring Security

Ten artykuł dotyczy: ✔️ wersja 4.14.0 ✔️ w wersji 5.8.0

W tym artykule opisano sposób, w jaki platforma Spring Cloud i usługa Spring Security mogą być używane razem.

Usługa Spring Security z identyfikatorem Entra firmy Microsoft

Podczas tworzenia aplikacji internetowej tożsamość i zarządzanie dostępem zawsze będą podstawowymi elementami.

Platforma Azure oferuje doskonałą platformę do demokratyzacji rozwoju aplikacji, ponieważ nie tylko oferuje usługę tożsamości w chmurze, ale także głęboką integrację z resztą ekosystemu platformy Azure.

Usługa Spring Security ułatwia zabezpieczanie aplikacji opartych na platformie Spring za pomocą zaawansowanych abstrakcji i rozszerzalnych interfejsów. Jednak tak zaawansowane, jak platforma Spring może być, nie jest dostosowane do określonego dostawcy tożsamości.

Zapewnia spring-cloud-azure-starter-active-directory najbardziej optymalny sposób łączenia aplikacji internetowej z dzierżawą Microsoft Entra ID (Microsoft Entra ID w skrócie) i ochrony serwera zasobów za pomocą identyfikatora Entra firmy Microsoft. Używa protokołu Oauth 2.0 do ochrony aplikacji internetowych i serwerów zasobów.

Uzyskiwanie dostępu do aplikacji internetowej

W tym scenariuszu jest używany przepływ udzielania kodu autoryzacji OAuth 2.0 w celu zalogowania się użytkownika przy użyciu konta Microsoft.

Diagram systemowy

System diagram for a standalone web application.

Tworzenie wymaganych zasobów na platformie Azure

  1. Przeczytaj szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.

  2. Tworzenie rejestracji aplikacji. Pobierz AZURE_TENANT_IDpolecenia , AZURE_CLIENT_IDi AZURE_CLIENT_SECRET.

  3. Ustaw redirect URI wartość na APPLICATION_BASE_URI/login/oauth2/code/ — na przykład http://localhost:8080/login/oauth2/code/. Ogon / jest wymagany.

Dodawanie wymaganych zależności

<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>

Dodawanie wymaganych właściwości

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Teraz uruchom aplikację i uzyskaj dostęp do aplikacji za pośrednictwem przeglądarki. Nastąpi przekierowanie do strony logowania firmy Microsoft.

Zaawansowane użycie

Dodawanie dodatkowych konfiguracji zabezpieczeń
@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
    }
}
Autoryzowanie dostępu według ról aplikacji

Utwórz wymagane zasoby na platformie Azure:

Uwaga

Jeśli chcesz użyć kontroli dostępu opartej na rolach aplikacji, nie możesz umieścić nazw grup w oświadczeniu role . Aby uzyskać więcej informacji, zobacz sekcję Konfigurowanie opcjonalnych oświadczeń grup w sekcji Zapewnianie opcjonalnych oświadczeń do aplikacji.

Chroń określoną metodę.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Autoryzowanie dostępu według nazwy grupy lub identyfikatora grupy

Dodaj powiązane właściwości konfiguracji.

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

Chroń określoną metodę.

@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";
   }
}
Korzystanie z krajowej platformy Azure zamiast globalnej platformy Azure

Teraz z wyjątkiem globalnej chmury platformy Azure identyfikator Entra firmy Microsoft jest wdrażany w następujących chmurach krajowych:

  • Azure Government

  • Azure w Chinach — 21Vianet

  • Azure (Niemcy)

Oto przykład użycia platformy Azure (Chiny) 21Vianet.

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

Aby uzyskać więcej informacji, zobacz Wdrożenia chmury krajowej.

Konfigurowanie szablonu identyfikatora URI przekierowania

Deweloperzy mogą dostosować identyfikator URI przekierowania.

System diagram for redirect URIs.

Dodaj redirect-uri-template właściwości w pliku application.yml .

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

Zaktualizuj redirect-uri w witrynie Azure Portal.

Configure Redirect URI Template.

Po ustawieniu redirect-uri-templateelementu musimy zaktualizować konstruktora zabezpieczeń:

@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();
    }
}

Połączenie do identyfikatora Entra firmy Microsoft za pośrednictwem serwera proxy

Aby połączyć microsoft Entra ID za pośrednictwem serwera proxy, podaj fasolę podobną RestTemplateCustomizer do przedstawionej w poniższym przykładzie:

@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);
        };
    }
}

Przykłady

Przykładowy projekt: aad-web-application.

Aplikacja internetowa, która uzyskuje dostęp do serwerów zasobów

Diagram systemowy

System diagram for a web application accessing resource servers.

Tworzenie wymaganych zasobów na platformie Azure

  1. Przeczytaj szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.

  2. Tworzenie rejestracji aplikacji. Pobierz AZURE_TENANT_IDpolecenia , AZURE_CLIENT_IDi AZURE_CLIENT_SECRET.

  3. Ustaw redirect URI wartość APPLICATION_BASE_URI/login/oauth2/code/, na przykład http://localhost:8080/login/oauth2/code/. Ogon / jest wymagany.

Dodawanie wymaganych zależności

<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>

Dodawanie wymaganych właściwości

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

graph W tym miejscu jest nazwą OAuth2AuthorizedClient, scopes oznacza zakresy potrzebne do wyrażenia zgody podczas logowania.

Używanie elementu OAuth2AuthorizedClient w aplikacji

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);
    }
}

Teraz uruchom aplikację i uzyskaj dostęp do aplikacji w przeglądarce. Następnie nastąpi przekierowanie do strony logowania firmy Microsoft.

Zaawansowane użycie

Przepływ poświadczeń klienta

Domyślny przepływ to przepływ kodu autoryzacji, jeśli chcesz użyć przepływu poświadczeń klienta, możesz skonfigurować w następujący sposób:

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Uzyskiwanie dostępu do wielu serwerów zasobów

W jednej aplikacji internetowej można uzyskać dostęp do wielu serwerów zasobów, konfigurując w następujący sposób:

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Następnie możesz użyć OAuth2AuthorizedClient w aplikacji podobnej do tej

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);
    }
}

Przykłady

Przykładowy projekt: aad-web-application.

Uzyskiwanie dostępu do serwera zasobów

Ten scenariusz nie obsługuje logowania, po prostu chroni serwer, sprawdzając token dostępu. Jeśli token dostępu jest prawidłowy, serwer obsługuje żądanie.

Diagram systemowy

System diagram for standalone resource server usage.

Tworzenie wymaganych zasobów na platformie Azure

  1. Przeczytaj szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.

  2. Tworzenie rejestracji aplikacji. Pobierz plik AZURE_CLIENT_ID.

  3. Przeczytaj szybki start: konfigurowanie aplikacji w celu uwidocznienia internetowego interfejsu API.

  4. Uwidaczniać internetowy interfejs API z zakresem o nazwie Scope-1.

Dodawanie wymaganych zależności

<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>

Dodawanie wymaganych właściwości

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

Teraz uruchom aplikację i uzyskaj dostęp do internetowego interfejsu API aplikacji.

  1. Otrzymasz 401 bez tokenu dostępu.

  2. Uzyskiwanie dostępu do aplikacji przy użyciu tokenu dostępu. Następujące oświadczenia w tokenie dostępu zostaną zweryfikowane:

    • iss: Token dostępu musi być wystawiony przez identyfikator Firmy Microsoft Entra.

    • nbf: bieżąca godzina nie może być wcześniejsza niż nbf.

    • exp: Bieżąca godzina nie może być późniejsza niż exp.

    • aud: Jeśli spring.cloud.azure.active-directory.credential.client-id grupa odbiorców musi być skonfigurowana lub spring.cloud.azure.active-directory.credential.app-id-uri skonfigurowana, musi być równa skonfigurowanemu client-id lub app-id-uri. Jeśli te dwie właściwości nie są skonfigurowane, to oświadczenie nie zostanie zweryfikowane.

Aby uzyskać więcej informacji na temat tokenu dostępu, zobacz dokumentację ms dotyczącą Platforma tożsamości Microsoft tokenów dostępu.

Zaawansowane użycie

Dodawanie dodatkowych konfiguracji zabezpieczeń
@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());
    }
}
Weryfikowanie uprawnień według zakresów
  1. Tworzenie wymaganych zasobów na platformie Azure.

  2. Chroń określoną metodę.

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

W tym celu w przypadku punktu końcowego dostępu /scope1 następujące oświadczenia w tokenie dostępu zostaną zweryfikowane:

  • scp: Wartość musi zawierać Scope1wartość .
Weryfikowanie uprawnień według ról aplikacji
  1. Tworzenie wymaganych zasobów na platformie Azure.

  2. Chroń określoną metodę.

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

W tym celu w przypadku punktu końcowego dostępu /app-role1 następujące oświadczenia w tokenie dostępu zostaną zweryfikowane:

  • roles: Wartość musi zawierać AppRole1wartość .
Korzystanie z uwierzytelniania klienta JWT

Aby użyć tokenu internetowego JSON (JWT) do uwierzytelniania klienta, wykonaj następujące kroki:

  1. Zobacz sekcję Rejestrowanie certyfikatu przy użyciu Platforma tożsamości Microsoft w Platforma tożsamości Microsoft poświadczenia certyfikatu uwierzytelniania aplikacji.
  2. Przekaż certyfikat pem do aplikacji zarejestrowanej w witrynie Azure Portal.
  3. Skonfiguruj ścieżkę certyfikatu i hasło elementu . PLIK PFX lub . Certyfikat P12 .
  4. Dodaj konfigurację właściwości spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt do klienta, który ma zostać uwierzytelniony za pomocą uwierzytelniania klienta JWT.

Poniższy przykładowy plik konfiguracji jest przeznaczony dla scenariusza aplikacji internetowej. Informacje o certyfikacie są konfigurowane we właściwościach globalnych.

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Informacje o certyfikacie można również skonfigurować we właściwościach active-directory usługi, jak pokazano w tym przykładzie:

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Połączenie do identyfikatora Entra firmy Microsoft za pośrednictwem serwera proxy

Aby połączyć microsoft Entra ID za pośrednictwem serwera proxy, podaj fasolę RestTemplateCustomizer . Aby uzyskać więcej informacji, zobacz sekcję Połączenie ing to Microsoft Entra ID via proxy (Identyfikator entra firmy Microsoft za pośrednictwem serwera proxy).

Przykłady

Przykładowy projekt: aad-resource-server.

Serwer zasobów odwiedzający inne serwery zasobów

Diagram systemowy

System diagram for a resource server visiting other resource servers.

Tworzenie wymaganych zasobów na platformie Azure

  1. Przeczytaj szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.

  2. Tworzenie rejestracji aplikacji. Pobierz AZURE_TENANT_IDpolecenia , AZURE_CLIENT_IDi AZURE_CLIENT_SECRET.

Dodawanie wymaganych zależności

<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>

Dodawanie wymaganych właściwości

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Używanie elementu OAuth2AuthorizedClient w aplikacji

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

Przykłady

Przykładowy projekt: aad-resource-server-obo.

Aplikacja internetowa i serwer zasobów w jednej aplikacji

Tworzenie wymaganych zasobów na platformie Azure

  1. Przeczytaj szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.

  2. Tworzenie rejestracji aplikacji. Pobierz AZURE_TENANT_IDpolecenia , AZURE_CLIENT_IDi AZURE_CLIENT_SECRET.

Dodawanie wymaganych zależności

<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>

Dodawanie wymaganych właściwości

Ustaw właściwość spring.cloud.azure.active-directory.application-type na web_application_and_resource_server, i określ typ autoryzacji dla każdego klienta autoryzacji.

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Definiowanie elementu SecurityFilterChain

Konfigurowanie wielu SecurityFilterChain wystąpień. AadWebApplicationAndResourceServerConfig Zawiera dwie konfiguracje łańcucha filtrów zabezpieczeń dla serwera zasobów i aplikacji internetowej.

@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
        }
    }
}

Konfigurowanie

Konfigurowalne właściwości spring-cloud-azure-starter-active-directory:

Nazwa/nazwisko opis
spring.cloud.azure.active-directory.app-id-uri Identyfikator URI identyfikatora aplikacji, który może być używany w oświadczeniu "aud" id_token.
spring.cloud.azure.active-directory.application-type Typ aplikacji Microsoft Entra.
spring.cloud.azure.active-directory.authenticate-additional-parameters Dodaj dodatkowe parametry do adresu URL autoryzacji.
spring.cloud.azure.active-directory.authorization-clients Klienci autoryzacji OAuth2.
spring.cloud.azure.active-directory.credential.client-id Identyfikator klienta do użycia podczas przeprowadzania uwierzytelniania jednostki usługi za pomocą platformy Azure.
spring.cloud.azure.active-directory.credential.client-secret Klucz tajny klienta używany podczas przeprowadzania uwierzytelniania jednostki usługi za pomocą platformy Azure.
spring.cloud.azure.active-directory.jwk-set-cache-cykl życia Żywotność buforowanego zestawu JWK ustawiona przed jego wygaśnięciem, wartość domyślna to 5 minut.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time Czas odświeżania buforowanego zestawu JWK ustawiony przed jego wygaśnięciem, wartość domyślna to 5 minut.
spring.cloud.azure.active-directory.jwt-connect-timeout Połączenie limit czasu dla wywołania zdalnego adresu URL zestawu JWKSet.
spring.cloud.azure.active-directory.jwt-read-timeout Limit czasu odczytu dla wywołania zdalnego adresu URL zestawu JWKSet.
spring.cloud.azure.active-directory.jwt-size-limit Limit rozmiaru w bajtach wywołania zdalnego adresu URL zestawu JWKSet.
spring.cloud.azure.active-directory.post-logout-redirect-uri Identyfikator URI przekierowania po wylogowaniu.
spring.cloud.azure.active-directory.profile.cloud-type Nazwa chmury platformy Azure do nawiązania połączenia. Obsługiwane typy to: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.
spring.cloud.azure.active-directory.profile.environment Właściwości do punktów końcowych firmy Microsoft Entra.
spring.cloud.azure.active-directory.profile.tenant-id Identyfikator dzierżawy platformy Azure. Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy.
spring.cloud.azure.active-directory.redirect-uri-template Punkt końcowy przekierowania: używany przez serwer autoryzacji do zwracania odpowiedzi zawierających poświadczenia autoryzacji do klienta za pośrednictwem agenta użytkownika-właściciela zasobu. Domyślna wartość to {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map Skonfiguruj, które oświadczenie będzie używane do kompilowania aplikacji GrantedAuthority i prefiksu wartości ciągu GrantedAuthority. Wartość domyślna to: "scp" —> "SCOPE_", "roles" —> "APPROLE_".
spring.cloud.azure.active-directory.resource-server.principal-claim-name Skonfiguruj oświadczenie, które oświadczenie w tokenie dostępu ma być zwracane w elemecie AuthenticatedPrincipal#getName. Wartość domyślna to "sub".
spring.cloud.azure.active-directory.session-stateless Jeśli wartość true aktywuje filtr bezstanowego uwierzytelniania AadAppRoleStatelessAuthenticationFilter. Wartość domyślna to false, która aktywuje filtr AadAuthenticationFilter.
spring.cloud.azure.active-directory.user-group.allowed-group-ids Identyfikatory grup mogą służyć do konstruowania elementu GrantedAuthority.
spring.cloud.azure.active-directory.user-group.allowed-group-names Nazwy grup mogą służyć do konstruowania aplikacji GrantedAuthority.
spring.cloud.azure.active-directory.user-group.use-transitive-members Jeśli wartość "true", użyj polecenia "v1.0/me/transitiveMemberOf", aby uzyskać członków. W przeciwnym razie użyj polecenia "v1.0/me/memberOf". Domyślna wartość to false.
spring.cloud.azure.active-directory.user-name-attribute Zdecyduj, które oświadczenie ma być nazwą podmiotu zabezpieczeń.

Oto kilka przykładów dotyczących używania tych właściwości:

Typ aplikacji

Typ aplikacji można wywnioskować z zależności: spring-security-oauth2-client lub spring-security-oauth2-resource-server. Jeśli wywnioskowana wartość nie jest odpowiednią wartością, możesz określić typ aplikacji. Oto tabela prawidłowych wartości i wywnioskowanych wartości:

Typ aplikacji:spring-cloud-azure-starter-active-directory

Ma zależność: spring-security-oauth2-client Ma zależność: spring-security-oauth2-resource-server Prawidłowe wartości typu aplikacji Wnioskowana wartość
Tak Nie. web_application web_application
Nie. Tak resource_server resource_server
Tak Tak web_application, resource_server, resource_server_with_obo, web_application_and_resource_server resource_server_with_obo

Spring Security z usługą Azure Active Directory B2C

Usługa Azure Active Directory (Azure AD) B2C jest usługą zarządzania tożsamościami, która pozwala na dostosowywanie i kontrolowanie sposobu, w jaki klienci tworzą konto, logują się i zarządzają swoimi profilami podczas korzystania z Twoich aplikacji. Usługa Azure AD B2C umożliwia wykonywanie tych akcji przy jednoczesnej ochronie tożsamości klientów.

Konfiguracja zależności

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

Konfigurowanie

Konfigurowalne właściwości spring-cloud-azure-starter-active-directory-b2c:

Nazwa/nazwisko opis
spring.cloud.azure.active-directory.b2c.app-id-uri Identyfikator URI identyfikatora aplikacji, który może być używany w oświadczeniu "aud" tokenu.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters Dodatkowe parametry uwierzytelniania.
spring.cloud.azure.active-directory.b2c.authorization-clients Określ konfigurację klienta.
spring.cloud.azure.active-directory.b2c.base-uri Podstawowy identyfikator URI punktu końcowego usługi Azure AD B2C.
spring.cloud.azure.active-directory.b2c.credential Informacje o poświadczeniach usługi Azure AD B2C.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout Połączenie limit czasu dla wywołania zdalnego adresu URL zestawu JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout Limit czasu odczytu dla wywołania zdalnego adresu URL zestawu JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-size-limit Limit rozmiaru w bajtach wywołania zdalnego adresu URL zestawu JWKSet.
spring.cloud.azure.active-directory.b2c.login-flow Określ podstawowy klucz przepływu logowania. Domyślna wartość to sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url Adres URL przekierowania po wylogowaniu. Domyślna wartość to http://localhost:8080/login.
spring.cloud.azure.active-directory.b2c.profile Informacje o profilu usługi Azure AD B2C.
spring.cloud.azure.active-directory.b2c.reply-url Adres URL odpowiedzi po otrzymaniu kodu autoryzacji. Domyślna wartość to {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flows Przepływy użytkownika.
spring.cloud.azure.active-directory.b2c.user-name-attribute-name Nazwa atrybutu nazwy użytkownika.

Aby uzyskać pełne konfiguracje, sprawdź właściwości konfiguracji platformy Azure spring Cloud.

Podstawowy sposób użycia

Aplikacja internetowa to dowolna aplikacja internetowa, która umożliwia użytkownikowi logowanie się przy użyciu identyfikatora Entra firmy Microsoft, natomiast serwer zasobów zaakceptuje lub odmówi dostępu po zweryfikowaniu access_token uzyskanych z identyfikatora Entra firmy Microsoft. W tym przewodniku omówimy 4 scenariusze:

  1. Uzyskiwanie dostępu do aplikacji internetowej.

  2. Aplikacja internetowa uzyskuje dostęp do serwerów zasobów.

  3. Uzyskiwanie dostępu do serwera zasobów.

  4. Serwer zasobów uzyskuje dostęp do innych serwerów zasobów.

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

Użycie 1. Uzyskiwanie dostępu do aplikacji internetowej

W tym scenariuszu jest używany przepływ udzielania kodu autoryzacji OAuth 2.0 w celu zalogowania użytkownika za pomocą użytkownika usługi Azure AD B2C.

Wybierz pozycję Azure AD B2C z menu portalu, wybierz pozycję Aplikacje, a następnie wybierz pozycję Dodaj.

Określ nazwę aplikacji (na przykład webapp), dodaj http://localhost:8080/login/oauth2/code/ adres URL odpowiedzi, zapisz identyfikator aplikacji jako WEB_APP_AZURE_CLIENT_ID, a następnie wybierz pozycję Zapisz.

Wybierz pozycję Klucze z aplikacji, wybierz pozycję Generuj klucz, aby wygenerować WEB_APP_AZURE_CLIENT_SECRETelement , a następnie wybierz pozycję Zapisz.

Wybierz pozycję Przepływy użytkownika po lewej stronie, a następnie wybierz pozycję Nowy przepływ użytkownika.

Wybierz pozycję Zarejestruj się lub w, Edytuj profil i Resetowanie hasła, aby utworzyć przepływy użytkownika odpowiednio. Określ nazwę przepływu użytkownika i atrybuty użytkownika i oświadczenia, a następnie wybierz pozycję Utwórz.

Wybierz pozycję Uprawnienia>interfejsu API Dodaj uprawnienie>Interfejsy API firmy Microsoft, wybierz pozycję Microsoft Graph, wybierz uprawnienia delegowane, wybierz offline_access i uprawnienia openid, a następnie wybierz pozycję Dodaj uprawnienie, aby ukończyć proces.

Udziel zgody administratora dla uprawnień programu Graph .

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

Dodaj następujące zależności do pliku 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>

Dodaj właściwości do pliku application.yml przy użyciu utworzonych wcześniej wartości, jak pokazano w poniższym przykładzie:

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}

Napisz kod Java.

W przypadku kodu kontrolera możesz zapoznać się z następującym przykładem:

@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";
   }
}

Kod konfiguracji zabezpieczeń można znaleźć w poniższym przykładzie:

@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
   }
}

Skopiuj plik home.html z przykładu aad-b2c-web-application i zastąp PROFILE_EDIT_USER_FLOW ciąg i PASSWORD_RESET_USER_FLOW nazwami przepływów użytkownika, które były wcześniej używane.

Skompiluj i przetestuj aplikację. Uruchom Webapp polecenie na porcie 8080.

Po skompiluj i uruchomieniu aplikacji przez narzędzie Maven otwórz aplikację http://localhost:8080/ w przeglądarce internetowej. Powinno nastąpić przekierowanie do strony logowania.

Wybierz link z przepływem użytkownika logowania. Aby rozpocząć proces uwierzytelniania, należy przekierować usługę Azure AD B2C.

Po pomyślnym zalogowaniu powinien zostać wyświetlony przykład home page z przeglądarki.

Użycie 2. Aplikacja internetowa, która uzyskuje dostęp do serwerów zasobów

Ten scenariusz jest oparty na scenariuszu Uzyskiwanie dostępu do aplikacji internetowej, aby umożliwić aplikacji dostęp do innych zasobów. W tym scenariuszu przepływ udzielania poświadczeń klienta OAuth 2.0.

Wybierz pozycję Azure AD B2C z menu portalu, wybierz pozycję Aplikacje, a następnie wybierz pozycję Dodaj.

Określ nazwę aplikacji (na przykład webApiA), zapisz identyfikator aplikacji jako WEB_API_A_AZURE_CLIENT_ID, a następnie wybierz pozycję Zapisz.

Wybierz pozycję Klucze z aplikacji, wybierz pozycję Generuj klucz, aby wygenerować WEB_API_A_AZURE_CLIENT_SECRETelement , a następnie wybierz pozycję Zapisz.

Wybierz pozycję Uwidocznij interfejs API w okienku nawigacji, a następnie wybierz pozycję Ustaw. Zarejestruj identyfikator URI identyfikatora aplikacji jako wartość WEB_API_A_APP_ID_URL, a następnie wybierz pozycję Zapisz.

Wybierz pozycję Manifest w okienku nawigacji, a następnie wklej następujący segment JSON do appRoles tablicy. Zapisz identyfikator URI identyfikatora aplikacji jako WEB_API_A_APP_ID_URLwartość roli aplikacji jako WEB_API_A_ROLE_VALUE, a następnie wybierz pozycję Zapisz.

{
 "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.

Wybierz pozycję Uprawnienia>interfejsu API Dodaj uprawnienie>Moje interfejsy API, wybierz pozycję Nazwa aplikacji WebApiA , wybierz pozycję Uprawnienia aplikacji, wybierz uprawnienie WebApiA.SampleScope , a następnie wybierz pozycję Dodaj uprawnienie , aby ukończyć proces.

Udziel zgody administratora na uprawnienia WebApiA.

Azure portal screenshot showing application API permissions screen.

Dodaj następującą zależność na podstawie scenariusza Uzyskiwanie dostępu do aplikacji internetowej.

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

Dodaj następującą konfigurację na podstawie scenariusza Uzyskiwanie dostępu do aplikacji internetowej.

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

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Webapp Napisz kod Java.

W przypadku kodu kontrolera możesz zapoznać się z następującym przykładem:

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.");
   }
}

Kod konfiguracji zabezpieczeń jest taki sam jak w scenariuszu Uzyskiwanie dostępu do aplikacji internetowej. Dodaj kolejny fasola webClient w następujący sposób:

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

Aby napisać WebApiA kod Java, zobacz sekcję Uzyskiwanie dostępu do serwera zasobów.

Skompiluj i przetestuj aplikację. Zezwalaj Webapp i WebApiA uruchamiaj odpowiednio na porcie 8080 i 8081 . Uruchom aplikacje Webapp i WebApiA . Wróć do strony głównej po pomyślnym zalogowaniu. Następnie możesz uzyskać dostęp, http://localhost:8080/webapp/webApiA aby uzyskać WebApiA odpowiedź na zasób.

Użycie 3. Uzyskiwanie dostępu do serwera zasobów

Ten scenariusz nie obsługuje logowania. Wystarczy chronić serwer, sprawdzając token dostępu, a jeśli jest prawidłowy, obsługuje żądanie.

Aby utworzyć WebApiA uprawnienie, zobacz Użycie 2: Dostęp do serwerów zasobów aplikacji internetowej.

Dodaj WebApiA uprawnienie i udziel zgody administratora dla aplikacji internetowej.

Dodaj następujące zależności do pliku 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>

Dodaj następującą konfigurację.

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}

Uwaga

Dozwolone tenant-id wartości to: common, organizations, consumerslub identyfikator dzierżawy. Aby uzyskać więcej informacji na temat tych wartości, zobacz sekcję Użycie nieprawidłowego punktu końcowego (konta osobiste i konta organizacji) w sekcji Błąd AADSTS50020 — konto użytkownika od dostawcy tożsamości nie istnieje w dzierżawie. Aby uzyskać informacje na temat konwertowania aplikacji z jedną dzierżawą, zobacz Konwertowanie aplikacji z jedną dzierżawą na wielodostępny w usłudze Microsoft Entra ID.

Napisz kod Java.

W przypadku kodu kontrolera możesz zapoznać się z następującym przykładem:

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.";
   }
}

Kod konfiguracji zabezpieczeń można znaleźć w poniższym przykładzie:

@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());
   }
}

Skompiluj i przetestuj aplikację. Uruchom WebApiA polecenie na porcie 8081. Pobierz token dostępu dla webApiA zasobu, a następnie uzyskaj dostęp http://localhost:8081/webApiA/sample jako nagłówek autoryzacji elementu nośnego.

Użycie 4. Serwer zasobów uzyskuje dostęp do innych serwerów zasobów

Ten scenariusz to uaktualnienie uzyskiwania dostępu do serwera zasobów i obsługuje dostęp do innych zasobów aplikacji na podstawie przepływu poświadczeń klienta OAuth2.

Odwołując się do poprzednich kroków, utworzymy aplikację WebApiB i udostępnimy uprawnienie WebApiB.SampleScopeaplikacji .

{
   "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.

Udziel zgody administratora na WebApiB uprawnienia.

Azure portal screenshot showing application WebApiA API permissions screen.

Na podstawie uzyskiwania dostępu do serwera zasobów dodaj następującą zależność do pliku pom.xml .

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

Dodaj następującą konfigurację na podstawie konfiguracji scenariusza uzyskiwania dostępu do serwera zasobów.

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

Napisz kod Java.

W przypadku WebApiA kodu kontrolera możesz zapoznać się z następującym przykładem:

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.");
   }
}

W przypadku WebApiB kodu kontrolera możesz zapoznać się z następującym przykładem:

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.";
   }
}

Kod konfiguracji zabezpieczeń jest taki sam , jak w przypadku uzyskiwania dostępu do scenariusza serwera zasobów, dodawany jest inny fasola webClient w następujący sposób

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

Skompiluj i przetestuj aplikację. Zezwalaj WebApiA i WebApiB uruchamiaj odpowiednio na porcie 8081 i 8082 . WebApiA Uruchom aplikacje iWebApiB, uzyskaj token dostępu dla webApiA zasobu i uzyskaj dostęp http://localhost:8081/webApiA/webApiB/sample jako nagłówek autoryzacji elementu nośnego.

Przykłady

Aby uzyskać więcej informacji, zobacz przykłady spring-cloud-azure-starter-active-directory-b2c.