Delen via


Spring Cloud Azure-ondersteuning voor Spring Security

Dit artikel is van toepassing op:✅ versie 4.19.0 ✅ versie 5.19.0

In dit artikel wordt beschreven hoe Spring Cloud Azure en Spring Security samen kunnen worden gebruikt.

Spring Security met Microsoft Entra-id

Wanneer u een webtoepassing bouwt, zijn identiteits- en toegangsbeheer altijd fundamentele onderdelen.

Azure biedt een geweldig platform om uw toepassingsontwikkelingstraject te democratiseren, omdat het niet alleen een cloudidentiteitsservice biedt, maar ook een diepgaande integratie met de rest van het Azure-ecosysteem.

Spring Security heeft het eenvoudig gemaakt om uw Spring-toepassingen te beveiligen met krachtige abstracties en uitbreidbare interfaces. Maar net zo krachtig als het Spring-framework kan zijn, is het niet afgestemd op een specifieke id-provider.

De spring-cloud-azure-starter-active-directory biedt de meest optimale manier om uw webtoepassing te verbinden met een Microsoft Entra ID -tenant (Microsoft Entra ID voor korte tijd) en uw resourceserver te beveiligen met Microsoft Entra ID. Het maakt gebruik van het Oauth 2.0-protocol om webtoepassingen en bronservers te beveiligen.

Toegang tot een webtoepassing

In dit scenario wordt de OAuth 2.0-autorisatiecode stroom verlenen om u aan te melden bij een gebruiker met een Microsoft-account.

Systeemdiagram

systeemdiagram voor een zelfstandige webtoepassing.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRETop.

  3. Stel redirect URI in op APPLICATION_BASE_URI/login/oauth2/code/, bijvoorbeeld http://localhost:8080/login/oauth2/code/. De tailing / is vereist.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Start nu uw toepassing en open uw toepassing via de browser. U wordt omgeleid naar de aanmeldingspagina van Microsoft.

Geavanceerd gebruik

Extra beveiligingsconfiguraties toevoegen
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

   /**
    * Add configuration logic as needed.
    */
   @Bean
   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
       http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
               .and()
           .authorizeHttpRequests()
               .anyRequest().authenticated();
           // Do some custom configuration.
       return http.build();
   }
}
Toegang autoriseren door app-rollen

Vereiste resources maken in Azure:

Notitie

Als u op rollen gebaseerd toegangsbeheer voor apps wilt gebruiken, kunt u geen groepsnamen in de role claim plaatsen. Zie de sectie Optionele claims configureren sectie van Optionele claims opgeven voor uw app-voor meer informatie.

Beveilig de specifieke methode.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Toegang autoriseren op groepsnaam of groeps-id

Gerelateerde configuratie-eigenschappen toevoegen.

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

Beveilig de specifieke methode.

@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";
   }
}
National Azure gebruiken in plaats van Global Azure

Met uitzondering van de globale Azure-cloud wordt Microsoft Entra ID geïmplementeerd in de volgende nationale clouds:

  • Azure Government

  • Azure China 21Vianet

  • Azure Duitsland

Hier volgt een voorbeeld met behulp van Azure China 21Vianet.

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

Zie Nationale cloudimplementatiesvoor meer informatie.

Omleidings-URI-sjabloon configureren

Ontwikkelaars kunnen de omleidings-URI aanpassen.

systeemdiagram voor omleidings-URI's.

Voeg redirect-uri-template eigenschappen toe aan uw application.yml-bestand.

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

Werk redirect-uri bij in Azure Portal.

omleidings-URI-sjabloon configureren.

Nadat we redirect-uri-templatehebben ingesteld, moeten we de opbouwfunctie voor beveiliging bijwerken:

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

    /**
     * Add configuration logic as needed.
     */
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
                .and()
            .oauth2Login()
                .loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
                .and()
            .authorizeHttpRequests()
                .anyRequest().authenticated();
        // @formatter:on
        return http.build();
    }
}

Verbinding maken met Microsoft Entra-id via proxy

Als u Microsoft Entra-id via een proxy wilt verbinden, geeft u een RestTemplateCustomizer bean op zoals in het volgende voorbeeld:

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

Monsters

Voorbeeldproject: aad-webtoepassing.

Webtoepassing die toegang heeft tot resourceservers

Systeemdiagram

systeemdiagram voor een webtoepassing die toegang heeft tot resourceservers.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRETop.

  3. Stel redirect URI in op APPLICATION_BASE_URI/login/oauth2/code/, bijvoorbeeld http://localhost:8080/login/oauth2/code/. De tailing / is vereist.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Hier is graph de naam van OAuth2AuthorizedClient, scopes betekent dit de bereiken die nodig zijn om toestemming te geven bij het aanmelden.

OAuth2AuthorizedClient gebruiken in uw toepassing

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

Start nu uw toepassing en open uw toepassing in de browser. Vervolgens wordt u omgeleid naar de aanmeldingspagina van Microsoft.

Geavanceerd gebruik

Clientreferentiestroom

De standaardstroom is autorisatiecodestroom, als u clientreferentiestroom wilt gebruiken, kunt u als volgt configureren:

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Toegang tot meerdere resourceservers

In één webtoepassing hebt u toegang tot meerdere resourceservers door als volgt te configureren:

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Vervolgens kunt u OAuth2AuthorizedClient gebruiken in een toepassing zoals deze

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

Monsters

Voorbeeldproject: aad-webtoepassing.

Toegang tot een resourceserver

Dit scenario biedt geen ondersteuning voor aanmelding. Beveilig de server alleen door het toegangstoken te valideren. Als het toegangstoken geldig is, dient de server de aanvraag.

Systeemdiagram

systeemdiagram voor het gebruik van zelfstandige resourceservers.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_CLIENT_ID.

  3. Lees quickstart: Een toepassing configureren om een web-API beschikbaar te maken.

  4. Een web-API beschikbaar maken met een bereik met de naam Scope-1.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Start nu uw toepassing en open de web-API van uw toepassing.

  1. U krijgt 401 zonder toegangstoken.

  2. Toegang tot uw toepassing met een toegangstoken. De volgende claims in het toegangstoken worden gevalideerd:

    • iss: het toegangstoken moet worden uitgegeven door Microsoft Entra ID.

    • nbf: de huidige tijd kan niet vóór nbfzijn.

    • exp: de huidige tijd kan niet na exp.

    • aud: als spring.cloud.azure.active-directory.credential.client-id of spring.cloud.azure.active-directory.credential.app-id-uri geconfigureerd, moet de doelgroep gelijk zijn aan de geconfigureerde client-id of app-id-uri. Als de twee eigenschappen niet zijn geconfigureerd, wordt deze claim niet gevalideerd.

Zie MS-documenten over toegangstokens van Microsoft Identity Platformvoor meer informatie over het toegangstoken.

Geavanceerd gebruik

Extra beveiligingsconfiguraties toevoegen
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2ResourceServerSecurityConfig {

    /**
     * Add configuration logic as needed.
     */
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
            .and()
            .authorizeHttpRequests()
            .anyRequest().authenticated();
        // @formatter:on
        return http.build();
    }
}
Machtiging valideren op bereik
  1. Maak vereiste resources in Azure.

  2. Beveilig de specifieke methode.

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

Als u dit doet, worden de volgende claims in het toegangstoken gevalideerd wanneer toegang /scope1 eindpunt:

  • scp: de waarde moet Scope1bevatten.
Machtiging valideren per app-rollen
  1. Maak vereiste resources in Azure.

  2. Beveilig de specifieke methode.

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

Als u dit doet, worden de volgende claims in het toegangstoken gevalideerd wanneer toegang /app-role1 eindpunt:

  • roles: de waarde moet AppRole1bevatten.
JWT-clientverificatie gebruiken

Als u een JSON-webtoken (JWT) wilt gebruiken voor clientverificatie, gebruikt u de volgende stappen:

  1. Zie het gedeelte Uw certificaat registreren bij Microsoft Identity Platform sectie van verificatiecertificaatreferenties voor microsoft-identiteitsplatformtoepassingen.
  2. Upload een PEM--certificaat naar de toepassing die is geregistreerd in Azure Portal.
  3. Configureer het certificaatpad en wachtwoord van een . PFX- of . P12 certificaat.
  4. Voeg de eigenschap spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt configuratie toe aan de client die moet worden geverifieerd via JWT-clientverificatie.

Het volgende voorbeeldconfiguratiebestand is bedoeld voor een webtoepassingsscenario. De certificaatgegevens worden geconfigureerd in de globale eigenschappen.

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

U kunt de certificaatgegevens ook configureren in de eigenschappen van de active-directory-service, zoals wordt weergegeven in dit voorbeeld:

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Verbinding maken met Microsoft Entra-id via proxy

Als u Microsoft Entra-id via proxy wilt verbinden, geeft u een RestTemplateCustomizer bean op. Zie de sectie Verbinding maken met Microsoft Entra-id via proxy voor meer informatie.

Monsters

Voorbeeldproject: aad-resource-server.

Resourceserver die andere resourceservers bezoekt

Systeemdiagram

systeemdiagram voor een resourceserver die andere resourceservers bezoekt.

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRETop.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

OAuth2AuthorizedClient gebruiken in uw toepassing

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

Monsters

Voorbeeldproject: aad-resource-server-obo.

Webtoepassing en resourceserver in één toepassing

Vereiste resources maken in Azure

  1. Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.

  2. Maak een app-registratie. Haal AZURE_TENANT_ID, AZURE_CLIENT_IDen AZURE_CLIENT_SECRETop.

Vereiste afhankelijkheden toevoegen

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

Vereiste eigenschappen toevoegen

Stel de eigenschap spring.cloud.azure.active-directory.application-type in op web_application_and_resource_serveren geef het autorisatietype voor elke autorisatieclient op.

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

SecurityFilterChain definiëren

Meerdere SecurityFilterChain-exemplaren configureren. AadWebApplicationAndResourceServerConfig bevat twee configuraties voor beveiligingsfilterketens voor resourceserver en webtoepassing.

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {

    @Bean
    @Order(1)
    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
                .and()
            // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.
            .securityMatcher("/api/**")
            .authorizeHttpRequests()
                .anyRequest().authenticated();
        return http.build();
    }

    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
                .and()
            .authorizeHttpRequests()
                .requestMatchers("/login").permitAll()
                .anyRequest().authenticated();
        // @formatter:on
        return http.build();
    }
}

Configuratie

Configureerbare eigenschappen van spring-cloud-azure-starter-active-directory:

Naam Beschrijving
spring.cloud.azure.active-directory.app-id-uri App-id-URI die kan worden gebruikt in de claim 'aud' van een id_token.
spring.cloud.azure.active-directory.application-type Type van de Microsoft Entra-toepassing.
spring.cloud.azure.active-directory.authenticate-additional-parameters Voeg extra parameters toe aan de autorisatie-URL.
spring.cloud.azure.active-directory.authorization-clients De OAuth2-autorisatieclients.
spring.cloud.azure.active-directory.credential.client-id Client-id die moet worden gebruikt bij het uitvoeren van service-principalverificatie met Azure.
spring.cloud.azure.active-directory.credential.client-secret Clientgeheim dat moet worden gebruikt bij het uitvoeren van service-principal-verificatie met Azure.
spring.cloud.azure.active-directory.jwk-set-cache-levensduur De levensduur van de in de cache opgeslagen JWK die is ingesteld voordat deze verloopt, is standaard 5 minuten.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time De vernieuwingstijd van de in de cache opgeslagen JWK die is ingesteld voordat deze verloopt, is standaard 5 minuten.
spring.cloud.azure.active-directory.jwt-connect-timeout Verbindingstime-out voor de externe URL-aanroep van JWKSet.
spring.cloud.azure.active-directory.jwt-read-timeout Time-out lezen voor de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.jwt-size-limit Groottelimiet in bytes van de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.post-logout-redirect-uri De omleidings-URI na afmelding.
spring.cloud.azure.active-directory.profile.cloud-type Naam van de Azure-cloud waarmee verbinding moet worden gemaakt. Ondersteunde typen zijn: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.
spring.cloud.azure.active-directory.profile.environment Eigenschappen voor Microsoft Entra-eindpunten.
spring.cloud.azure.active-directory.profile.tenant-id Azure-tenant-id. De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id.
spring.cloud.azure.active-directory.redirect-uri-template Omleidingseindpunt: wordt gebruikt door de autorisatieserver om antwoorden met autorisatiereferenties naar de client te retourneren via de gebruikersagent van de resource-eigenaar. De standaardwaarde is {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map Configureer welke claim wordt gebruikt voor het bouwen van GrantedAuthority en het voorvoegsel van de tekenreekswaarde van GrantedAuthority. De standaardwaarde is: 'scp' -> 'SCOPE_', 'rollen' -> 'APPROLE_'.
spring.cloud.azure.active-directory.resource-server.principal-claim-name Configureer welke claim in toegangstoken moet worden geretourneerd in AuthenticatedPrincipal#getName. De standaardwaarde is 'sub'.
spring.cloud.azure.active-directory.session-stateless Als waar is, wordt het staatloze verificatiefilter AadAppRoleStatelessAuthenticationFilter geactiveerd. De standaardwaarde is onwaar waarmee AadAuthenticationFilter wordt geactiveerd.
spring.cloud.azure.active-directory.user-group.allowed-group-ids De groeps-id's kunnen worden gebruikt om GrantedAuthority samen te stellen.
spring.cloud.azure.active-directory.user-group.allowed-group-names De groepsnamen kunnen worden gebruikt om GrantedAuthority samen te stellen.
spring.cloud.azure.active-directory.user-group.use-transitive-members Als 'true', gebruikt u 'v1.0/me/transitiveMemberOf' om leden op te halen. Gebruik anders 'v1.0/me/memberOf'. De standaardwaarde is false.
spring.cloud.azure.active-directory.user-name-attribute Bepaal welke claim de naam van de principal moet zijn.

Hier volgen enkele voorbeelden van het gebruik van deze eigenschappen:

Toepassingstype

Het toepassingstype kan worden afgeleid van de afhankelijkheden: spring-security-oauth2-client of spring-security-oauth2-resource-server. Als de uitgestelde waarde niet de gewenste waarde is, kunt u het toepassingstype opgeven. Hier volgt de tabel met geldige waarden en uitgestelde waarden:

Toepassingstype van spring-cloud-azure-starter-active-directory:

Heeft afhankelijkheid: spring-security-oauth2-client Heeft afhankelijkheid: spring-security-oauth2-resource-server Geldige waarden van het toepassingstype Uitgestelde waarde
Ja Nee web_application web_application
Nee Ja resource_server resource_server
Ja Ja web_application, resource_server, resource_server_with_obo, web_application_and_resource_server resource_server_with_obo

Spring Security met Azure Active Directory B2C

Azure Active Directory (Azure AD) B2C is een service voor identiteitsbeheer waarmee u kunt aanpassen en bepalen hoe klanten zich registreren, aanmelden en hun profielen beheren wanneer ze uw toepassingen gebruiken. Azure AD B2C maakt deze acties mogelijk en beschermt tegelijkertijd de identiteiten van uw klanten.

Afhankelijkheid instellen

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

Configuratie

Configureerbare eigenschappen van spring-cloud-azure-starter-active-directory-b2c:

Naam Beschrijving
spring.cloud.azure.active-directory.b2c.app-id-uri App-id-URI die kan worden gebruikt in de claim aud van een token.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters Aanvullende parameters voor verificatie.
spring.cloud.azure.active-directory.b2c.authorization-clients Geef de clientconfiguratie op.
spring.cloud.azure.active-directory.b2c.base-uri Basis-URI van Azure AD B2C-eindpunt.
spring.cloud.azure.active-directory.b2c.credential Azure AD B2C-referentiegegevens.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout Verbindingstime-out voor de externe URL-aanroep van JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout Time-out lezen voor de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.b2c.jwt-size-limit Groottelimiet in bytes van de externe JWKSet-URL-aanroep.
spring.cloud.azure.active-directory.b2c.login-flow Geef de primaire aanmeldingsstroomsleutel op. De standaardwaarde is sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url Omleidings-URL na afmelding. De standaardwaarde is http://localhost:8080/login.
spring.cloud.azure.active-directory.b2c.profile Azure AD B2C-profielgegevens.
spring.cloud.azure.active-directory.b2c.reply-url Antwoord-URL na het ophalen van autorisatiecode. De standaardwaarde is {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flows Gebruikersstromen.
spring.cloud.azure.active-directory.b2c.user-name-attribute-name Kenmerknaam van gebruikersnaam.

Controleer Eigenschappen van Spring Cloud Azure-configuratievoor volledige configuraties.

Basisgebruik

Een -webtoepassing is een webtoepassing waarmee de gebruiker zich kan aanmelden met Microsoft Entra ID, terwijl een resourceserver toegang accepteert of weigert nadat access_token is verkregen bij Microsoft Entra ID. In deze handleiding worden vier scenario's behandeld:

  1. Toegang tot een webtoepassing.

  2. Webtoepassing die toegang heeft tot resourceservers.

  3. Toegang tot een resourceserver.

  4. Resourceserver die toegang heeft tot andere resourceservers.

Gebruik 1: Toegang tot een webtoepassing

In dit scenario wordt de OAuth 2.0-autorisatiecode stroom verlenen om u aan te melden bij een gebruiker met uw Azure AD B2C-gebruiker.

Selecteer Azure AD B2C- in het portalmenu, selecteer Toepassingenen selecteer vervolgens toevoegen.

Geef uw toepassing naam op (zoals webapp), voeg http://localhost:8080/login/oauth2/code/ toe voor de antwoord-URL, noteer de toepassings-id als uw WEB_APP_AZURE_CLIENT_IDen selecteer vervolgens Opslaan.

Selecteer Sleutels in uw toepassing, selecteer Sleutel genereren om WEB_APP_AZURE_CLIENT_SECRETte genereren en selecteer vervolgens Opslaan.

Selecteer Gebruikersstromen aan de linkerkant en selecteer vervolgens Nieuwe gebruikersstroom.

Kies Registreren of in, Profiel bewerkenen wachtwoord opnieuw instellen om respectievelijk gebruikersstromen te maken. Geef de gebruikersstroom op naam en gebruikerskenmerken en claimsen selecteer vervolgens maken.

Selecteer API-machtigingen>Een machtiging toevoegen>Microsoft-API's, selecteer Microsoft Graph, selecteer Gedelegeerde machtigingen, selecteer de offline_access en openid machtigingen en selecteer vervolgens Machtiging toevoegen om het proces te voltooien.

Beheerderstoestemming verlenen voor Graph-machtigingen.

Schermopname van Azure Portal met API-machtigingenscherm voor een app, met grafiekmachtigingen gemarkeerd.

Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand.

<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-springsecurity6</artifactId>
   </dependency>
</dependencies>

Voeg eigenschappen toe aan uw application.yml-bestand met behulp van de waarden die u eerder hebt gemaakt, zoals wordt weergegeven in het volgende voorbeeld:

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}

Schrijf uw Java-code.

Voor de controllercode kunt u het volgende voorbeeld raadplegen:

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

Raadpleeg het volgende voorbeeld voor uw beveiligingsconfiguratiecode:

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class WebSecurityConfiguration {

    private final AadB2cOidcLoginConfigurer configurer;

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

    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.authorizeHttpRequests()
                .anyRequest().authenticated()
                .and()
            .apply(configurer);
        // @formatter:on
        return http.build();
    }
}

Kopieer de home.html uit voorbeeld van een aad-b2c-webtoepassingen vervang de PROFILE_EDIT_USER_FLOW en PASSWORD_RESET_USER_FLOW door de namen van uw gebruikersstroom die u eerder hebt gebruikt.

Bouw en test uw app. Laat Webapp uitvoeren op poort 8080.

Nadat uw toepassing is gemaakt en gestart door Maven, opent u http://localhost:8080/ in een webbrowser. U wordt omgeleid naar de aanmeldingspagina.

Selecteer de koppeling met de aanmeldingsgebruikersstroom. U moet Azure AD B2C omleiden om het verificatieproces te starten.

Nadat u bent aangemeld, ziet u het voorbeeld home page in de browser.

Gebruik 2: Webtoepassing die toegang heeft tot resourceservers

Dit scenario is gebaseerd op de Toegang tot een webtoepassing scenario om een toepassing toegang te geven tot andere resources. Dit scenario is de OAuth 2.0-clientreferenties stroom verlenen.

Selecteer Azure AD B2C- in het portalmenu, selecteer Toepassingenen selecteer vervolgens toevoegen.

Geef uw toepassing naam op (zoals webApiA), noteer de toepassings-id als uw WEB_API_A_AZURE_CLIENT_IDen selecteer vervolgens Opslaan.

Selecteer Sleutels in uw toepassing, selecteer Sleutel genereren om WEB_API_A_AZURE_CLIENT_SECRETte genereren en selecteer vervolgens Opslaan.

Selecteer Een API- beschikbaar maken in het navigatiedeelvenster en selecteer vervolgens instellen. Noteer de URI van de toepassings-id als uw WEB_API_A_APP_ID_URLen selecteer vervolgens Opslaan.

Selecteer Manifest in het navigatiedeelvenster en plak het volgende JSON-segment in appRoles matrix. Noteer de URI van de toepassings-id als uw WEB_API_A_APP_ID_URL, noteer de waarde van de app-rol als uw WEB_API_A_ROLE_VALUEen selecteer vervolgens Opslaan.

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

Selecteer API-machtigingen>Een machtiging toevoegen>Mijn API's, selecteer WebApiA toepassingsnaam, selecteer Toepassingsmachtigingen, selecteer WebApiA.SampleScope machtiging en selecteer vervolgens Machtiging toevoegen om het proces te voltooien.

Beheerderstoestemming verlenen voor WebApiA- machtigingen.

schermopname van Azure Portal met api-machtigingen voor toepassingen.

Voeg de volgende afhankelijkheid toe op basis van de Accessing a web application scenario.

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

Voeg de volgende configuratie toe op basis van de Accessing a web application scenario.

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

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Schrijf uw Webapp Java-code.

Voor de controllercode kunt u het volgende voorbeeld raadplegen:

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

Beveiligingsconfiguratiecode is hetzelfde als in de Toegang tot een webtoepassing scenario. Voeg als volgt een andere webClient toe:

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

Als u uw WebApiA Java-code wilt schrijven, raadpleegt u de sectie Toegang tot een resourceserver.

Bouw en test uw app. Laat Webapp en WebApiA op respectievelijk poort 8080 en 8081 worden uitgevoerd. Start de Webapp- en WebApiA-toepassingen. Ga terug naar de startpagina nadat u zich hebt aangemeld. Vervolgens hebt u toegang tot http://localhost:8080/webapp/webApiA om het antwoord van de WebApiA resource op te halen.

Gebruik 3: Toegang tot een resourceserver

Dit scenario biedt geen ondersteuning voor aanmelding. Beveilig de server door het toegangstoken te valideren en als dit geldig is, wordt de aanvraag verwerkt.

Zie WebApiAom uw -machtiging te maken.

Voeg WebApiA machtiging toe en ververleent beheerderstoestemming voor uw webtoepassing.

Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand.

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

Voeg de volgende configuratie toe.

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}

Notitie

De waarden die zijn toegestaan voor tenant-id zijn: common, organizations, consumersof de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.

Schrijf uw Java-code.

Voor de controllercode kunt u het volgende voorbeeld raadplegen:

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

Raadpleeg het volgende voorbeeld voor uw beveiligingsconfiguratiecode:

@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class ResourceServerConfiguration {
    
    @Bean
    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
        JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
        JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
        jwtGrantedAuthoritiesConverter.setAuthorityPrefix("APPROLE_");
        authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
        // @formatter:off
        http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated())
            .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(authenticationConverter);
        // @formatter:on
        return http.build();
    }
}

Bouw en test uw app. Laat WebApiA uitvoeren op poort 8081. Haal het toegangstoken op voor de webApiA resource en open vervolgens http://localhost:8081/webApiA/sample als de Bearer-autorisatieheader.

Gebruik 4: Resourceserver die toegang heeft tot andere resourceservers

Dit scenario is een upgrade van Toegang tot een resourceserveren ondersteunt toegang tot andere toepassingsresources, op basis van de OAuth2-clientreferentiestroom.

Als we naar de vorige stappen verwijzen, maken we een WebApiB toepassing en maken we een toepassingsmachtiging beschikbaar 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"
}

Beheerderstoestemming verlenen voor WebApiB machtigingen.

schermopname van De WebApiA API van de toepassing.

Voeg op basis van Toegang tot een resourceserverde volgende afhankelijkheid toe aan uw pom.xml-bestand.

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

Voeg de volgende configuratie toe op basis van de Toegang tot een resourceserver scenarioconfiguratie.

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

Schrijf uw Java-code.

Voor uw WebApiA controllercode kunt u het volgende voorbeeld raadplegen:

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

Voor uw WebApiB controllercode kunt u het volgende voorbeeld raadplegen:

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

Beveiligingsconfiguratiecode is hetzelfde met Toegang tot een resourceserver scenario. Er wordt als volgt een andere bean-webClient toegevoegd

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

Bouw en test uw app. Laat WebApiA en WebApiB worden uitgevoerd op respectievelijk poort 8081 en 8082. Start de WebApiA- en WebApiB-toepassingen, haal het toegangstoken op voor webApiA resource en open http://localhost:8081/webApiA/webApiB/sample als de Bearer-autorisatieheader.

Monsters

Zie de spring-cloud-azure-starter-active-directory-b2c-voorbeeldenvoor meer informatie.