Bagikan melalui


Dukungan Spring Cloud Azure untuk Spring Security

Artikel ini menjelaskan bagaimana Spring Cloud Azure dan Spring Security dapat digunakan bersama-sama.

Keamanan Spring dengan ID Microsoft Entra

Saat Anda membangun aplikasi web, manajemen identitas dan akses akan selalu menjadi potongan dasar.

Azure menawarkan platform hebat untuk mendemokratisasi perjalanan pengembangan aplikasi Anda, karena tidak hanya menawarkan layanan identitas berbasis cloud, tetapi juga integrasi mendalam dengan sisa ekosistem Azure.

Spring Security telah memudahkan untuk mengamankan aplikasi berbasis Spring Anda dengan abstraksi yang kuat dan antarmuka yang dapat diperluas. Namun, sekuat kerangka kerja Spring, kerangka kerja tersebut tidak disesuaikan dengan penyedia identitas tertentu.

spring-cloud-azure-starter-active-directory menyediakan cara paling optimal untuk menghubungkan aplikasi web Anda ke penyewa ID Microsoft Entra (ID Microsoft Entra singkatnya) dan melindungi server sumber daya Anda dengan ID Microsoft Entra. Ini menggunakan protokol Oauth 2.0 untuk melindungi aplikasi web dan server sumber daya.

Mengakses aplikasi web

Skenario ini menggunakan kode otorisasi OAuth 2.0 memberikan alur untuk masuk ke pengguna dengan akun Microsoft.

Diagram Sistem

Diagram Sistem untuk aplikasi web mandiri.

Membuat sumber daya yang diperlukan di Azure

  1. Baca mulai cepat : Mendaftarkan aplikasi dengan platform identitas Microsoft.

  2. Membuat pendaftaran aplikasi. Dapatkan AZURE_TENANT_ID, AZURE_CLIENT_ID, dan AZURE_CLIENT_SECRET.

  3. Atur redirect URI ke APPLICATION_BASE_URI/login/oauth2/code/ - misalnya http://localhost:8080/login/oauth2/code/. / tailing diperlukan.

Menambahkan dependensi yang diperlukan

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

Menambahkan properti yang diperlukan

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Sekarang, mulai aplikasi Anda dan akses aplikasi Anda melalui browser. Anda akan diarahkan ke halaman masuk Microsoft.

Penggunaan tingkat lanjut

Menambahkan konfigurasi keamanan tambahan
@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();
   }
}
Mengotorisasi akses menurut peran aplikasi

Buat sumber daya yang diperlukan di Azure:

Nota

Jika ingin menggunakan kontrol akses berbasis peran aplikasi, Anda tidak dapat memasukkan nama grup ke dalam klaim role. Untuk informasi selengkapnya, lihat bagian Mengonfigurasi klaim opsional grup dari Memberikan klaim opsional ke aplikasi Anda.

Lindungi metode tertentu.

class Demo {
   @GetMapping("Admin")
   @ResponseBody
   @PreAuthorize("hasAuthority('APPROLE_Admin')")
   public String admin() {
       return "Admin message";
   }
}
Mengotorisasi akses menurut nama grup atau ID grup

Tambahkan properti konfigurasi terkait.

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

Lindungi metode tertentu.

@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";
   }
}
Menggunakan National Azure alih-alih Global Azure

Sekarang kecuali cloud Azure global, ID Microsoft Entra disebarkan di cloud nasional berikut:

  • Layanan Azure untuk Pemerintah

  • Azure Tiongkok 21Vianet

  • Azure Jerman

Berikut adalah sampel menggunakan Azure China 21Vianet.

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

Untuk informasi selengkapnya, lihat Penyebaran cloud nasional.

Mengonfigurasi templat URI pengalihan

Pengembang dapat menyesuaikan uri pengalihan.

Diagram Sistem untuk URI pengalihan.

Tambahkan properti redirect-uri-template di file application.yml Anda.

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

Perbarui redirect-uri di portal Microsoft Azure.

Mengonfigurasi Templat URI Pengalihan.

Setelah kita mengatur redirect-uri-template, kita perlu memperbarui pembuat keamanan:

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

Menyambungkan ke ID Microsoft Entra melalui proksi

Untuk menyambungkan ID Microsoft Entra melalui proksi, berikan kacang RestTemplateCustomizer seperti yang ditunjukkan dalam contoh berikut:

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

Sampel

Contoh proyek: aad-web-application.

Aplikasi web mengakses server sumber daya

Diagram Sistem

Diagram sistem untuk aplikasi web yang mengakses server sumber daya.

Membuat Sumber Daya yang Diperlukan di Azure

  1. Baca mulai cepat : Mendaftarkan aplikasi dengan platform identitas Microsoft.

  2. Membuat pendaftaran aplikasi. Dapatkan AZURE_TENANT_ID, AZURE_CLIENT_ID, dan AZURE_CLIENT_SECRET.

  3. Atur redirect URI ke APPLICATION_BASE_URI/login/oauth2/code/, misalnya http://localhost:8080/login/oauth2/code/. / tailing diperlukan.

Menambahkan dependensi yang diperlukan

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

Menambahkan properti yang diperlukan

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Di sini, graph adalah nama OAuth2AuthorizedClient, scopes berarti cakupan yang diperlukan untuk menyetujui saat masuk.

Menggunakan OAuth2AuthorizedClient di aplikasi Anda

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

Sekarang, mulai aplikasi Anda dan akses aplikasi Anda di browser. Kemudian, Anda akan diarahkan ke halaman masuk Microsoft.

Penggunaan tingkat lanjut

Alur Kredensial Klien

Alur default adalah alur kode otorisasi, jika Anda ingin menggunakan alur kredensial klien , Anda dapat mengonfigurasi seperti ini:

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Mengakses beberapa server sumber daya

Dalam satu aplikasi web, Anda dapat mengakses beberapa server sumber daya dengan mengonfigurasi seperti ini:

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Kemudian Anda dapat menggunakan OAuth2AuthorizedClient dalam aplikasi seperti ini

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

Sampel

Contoh proyek: aad-web-application.

Mengakses server sumber daya

Skenario ini tidak mendukung login, cukup lindungi server dengan memvalidasi token akses. Jika token akses valid, server melayani permintaan.

Diagram Sistem

diagram sistem untuk penggunaan server sumber daya mandiri.

Membuat sumber daya yang diperlukan di Azure

  1. Baca mulai cepat : Mendaftarkan aplikasi dengan platform identitas Microsoft.

  2. Membuat pendaftaran aplikasi. Dapatkan AZURE_CLIENT_ID.

  3. Baca mulai cepat : Mengonfigurasi aplikasi untuk mengekspos API web.

  4. Mengekspos API web dengan cakupan bernama Scope-1.

Menambahkan dependensi yang diperlukan

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

Menambahkan properti yang diperlukan

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

Sekarang mulai aplikasi Anda dan akses api web aplikasi Anda.

  1. Anda akan mendapatkan 401 tanpa token akses.

  2. Akses aplikasi Anda dengan token akses. Klaim berikut dalam token akses akan divalidasi:

    • iss: Token akses harus dikeluarkan oleh ID Microsoft Entra.

    • nbf: Waktu saat ini tidak boleh sebelum nbf.

    • exp: Waktu saat ini tidak dapat setelah exp.

    • aud: Jika spring.cloud.azure.active-directory.credential.client-id atau spring.cloud.azure.active-directory.credential.app-id-uri dikonfigurasi, audiens harus sama dengan client-id yang dikonfigurasi atau app-id-uri. Jika kedua properti tidak dikonfigurasi, klaim ini tidak akan divalidasi.

Untuk informasi selengkapnya tentang token akses, lihat dokumen MS tentang token akses platform identitas Microsoft.

Penggunaan tingkat lanjut

Menambahkan konfigurasi keamanan tambahan
@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();
    }
}
Memvalidasi izin menurut cakupan
  1. Buat sumber daya yang diperlukan di Azure.

  2. Lindungi metode tertentu.

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

Dengan melakukan ini, ketika akses /scope1 titik akhir, klaim berikut dalam token akses akan divalidasi:

  • scp: Nilai harus berisi Scope1.
Memvalidasi izin menurut peran aplikasi
  1. Buat sumber daya yang diperlukan di Azure.

  2. Lindungi metode tertentu.

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

Dengan melakukan ini, ketika akses /app-role1 titik akhir, klaim berikut dalam token akses akan divalidasi:

  • roles: Nilai harus berisi AppRole1.
Menggunakan autentikasi klien JWT

Untuk menggunakan JSON Web Token (JWT) untuk autentikasi klien, gunakan langkah-langkah berikut:

  1. Lihat bagian Mendaftarkan sertifikat Anda dengan platform identitas Microsoft dari kredensial sertifikat autentikasi aplikasi platform identitas Microsoft.
  2. Unggah sertifikat .pem ke aplikasi yang terdaftar di portal Microsoft Azure.
  3. Konfigurasikan jalur sertifikat dan kata sandi . PFX atau . Sertifikat P12.
  4. Tambahkan properti spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt konfigurasi ke klien untuk diautentikasi melalui autentikasi klien JWT.

Contoh file konfigurasi berikut adalah untuk skenario aplikasi web. Informasi sertifikat dikonfigurasi di properti global.

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Anda juga dapat mengonfigurasi informasi sertifikat di properti layanan active-directory, seperti yang ditunjukkan dalam contoh ini:

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Menyambungkan ke ID Microsoft Entra melalui proksi

Untuk menyambungkan ID Microsoft Entra melalui proksi, berikan kacang RestTemplateCustomizer. Untuk informasi selengkapnya, lihat bagian Menyambungkan ke ID Microsoft Entra melalui proksi.

Sampel

Proyek sampel: aad-resource-server.

Server sumber daya mengunjungi server sumber daya lain

Diagram Sistem

Diagram sistem untuk server sumber daya yang mengunjungi server sumber daya lain.

Membuat sumber daya yang diperlukan di Azure

  1. Baca mulai cepat : Mendaftarkan aplikasi dengan platform identitas Microsoft.

  2. Membuat pendaftaran aplikasi. Dapatkan AZURE_TENANT_ID, AZURE_CLIENT_ID, dan AZURE_CLIENT_SECRET.

Menambahkan dependensi yang diperlukan

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

Menambahkan properti yang diperlukan

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Menggunakan OAuth2AuthorizedClient di aplikasi Anda

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

Sampel

Proyek sampel: aad-resource-server-obo.

Aplikasi web dan server sumber daya dalam satu aplikasi

Membuat sumber daya yang diperlukan di Azure

  1. Baca mulai cepat : Mendaftarkan aplikasi dengan platform identitas Microsoft.

  2. Membuat pendaftaran aplikasi. Dapatkan AZURE_TENANT_ID, AZURE_CLIENT_ID, dan AZURE_CLIENT_SECRET.

Menambahkan dependensi yang diperlukan

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

Menambahkan properti yang diperlukan

Atur properti spring.cloud.azure.active-directory.application-type ke web_application_and_resource_server, dan tentukan jenis otorisasi untuk setiap klien otorisasi.

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Tentukan SecurityFilterChain

Konfigurasikan beberapa instans SecurityFilterChain. AadWebApplicationAndResourceServerConfig berisi dua konfigurasi rantai filter keamanan untuk server sumber daya dan aplikasi web.

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

Konfigurasi

Properti yang dapat dikonfigurasi dari spring-cloud-azure-starter-active-directory:

Nama Deskripsi
spring.cloud.azure.active-directory.app-id-uri URI ID Aplikasi yang mungkin digunakan dalam klaim "aud" dari id_token.
spring.cloud.azure.active-directory.application-type Jenis aplikasi Microsoft Entra.
spring.cloud.azure.active-directory.authenticate-additional-parameters Tambahkan parameter tambahan ke URL Otorisasi.
spring.cloud.azure.active-directory.authorization-clients Klien otorisasi OAuth2.
Spring.cloud.azure.active-directory.credential.client-id Id Klien untuk digunakan saat melakukan autentikasi perwakilan layanan dengan Azure.
musim semi.cloud.azure.aktif-direktori.kredensial.rahasia-klien Rahasia klien untuk digunakan saat melakukan autentikasi perwakilan layanan dengan Azure.
spring.cloud.azure.active-directory.jwk-set-cache-lifespan Masa pakai set JWK yang di-cache sebelum kedaluwarsa, defaultnya adalah 5 menit.
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time Waktu refresh set JWK yang di-cache sebelum kedaluwarsa, defaultnya adalah 5 menit.
musim semi.cloud.azure.active-directory.jwt-connect-timeout Batas Waktu Koneksi untuk panggilan URL Jarak Jauh JWKSet.
spring.cloud.azure.active-directory.jwt-read-timeout Baca Batas Waktu untuk panggilan URL Jarak Jauh JWKSet.
spring.cloud.azure.active-directory.jwt-size-limit Batas ukuran dalam Byte dari panggilan URL Jarak Jauh JWKSet.
spring.cloud.azure.active-directory.post-logout-redirect-uri Uri pengalihan setelah keluar.
spring.cloud.azure.active-directory.profile.cloud-type Nama cloud Azure untuk disambungkan. Jenis yang didukung adalah: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.
musim semi.cloud.azure.aktif-direktori.profil.lingkungan Properti untuk titik akhir Microsoft Entra.
spring.cloud.azure.active-directory.profile.tenant-id ID Penyewa Azure. Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa.
spring.cloud.azure.active-directory.redirect-uri-template Titik Akhir Pengalihan: Digunakan oleh server otorisasi untuk mengembalikan respons yang berisi kredensial otorisasi kepada klien melalui agen pengguna pemilik sumber daya. Nilai defaultnya adalah {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map Konfigurasikan klaim mana yang akan digunakan untuk membangun GrantedAuthority, dan awalan nilai string GrantedAuthority. Nilai defaultnya adalah: "scp" -> "SCOPE_", "roles" -> "APPROLE_".
spring.cloud.azure.active-directory.resource-server.principal-claim-name Konfigurasikan klaim mana dalam token akses yang dikembalikan di AuthenticatedPrincipal#getName. Nilai defaultnya adalah "sub".
spring.cloud.azure.active-directory.session-stateless Jika true mengaktifkan filter autentikasi stateless AadAppRoleStatelessAuthenticationFilter. Defaultnya adalah false yang mengaktifkan AadAuthenticationFilter.
spring.cloud.azure.active-directory.user-group.allowed-group-ids Id grup dapat digunakan untuk membuat GrantedAuthority.
spring.cloud.azure.active-directory.user-group.allowed-group-names Nama grup dapat digunakan untuk membuat GrantedAuthority.
musim semi.cloud.azure.active-directory.user-group.use-transitive-members Jika "true", gunakan "v1.0/me/transitiveMemberOf" untuk mendapatkan anggota. Jika tidak, gunakan "v1.0/me/memberOf". Nilai defaultnya adalah false.
spring.cloud.azure.active-directory.user-name-attribute Tentukan klaim mana yang akan menjadi nama utama.

Berikut adalah beberapa contoh tentang cara menggunakan properti ini:

Jenis aplikasi

Jenis aplikasi dapat disimpulkan dari dependensi: spring-security-oauth2-client atau spring-security-oauth2-resource-server. Jika nilai yang disimpulkan bukan nilai yang Anda inginkan, Anda dapat menentukan jenis aplikasi. Berikut adalah tabel nilai yang valid dan nilai yang disimpulkan:

Jenis aplikasi spring-cloud-azure-starter-active-directory:

Memiliki dependensi: spring-security-oauth2-client Memiliki dependensi: spring-security-oauth2-resource-server Nilai jenis aplikasi yang valid Nilai yang disimpulkan
Ya Tidak web_application web_application
Tidak Ya resource_server resource_server
Ya Ya web_application,resource_server,resource_server_with_obo,web_application_and_resource_server resource_server_with_obo

Spring Security dengan Azure Active Directory B2C

Azure Active Directory (Azure AD) B2C adalah layanan manajemen identitas yang memungkinkan Anda menyesuaikan dan mengontrol cara pelanggan mendaftar, masuk, dan mengelola profil mereka saat menggunakan aplikasi Anda. Azure AD B2C memungkinkan tindakan ini sekaligus melindungi identitas pelanggan Anda secara bersamaan.

Penyiapan dependensi

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

Konfigurasi

Properti spring-cloud-azure-starter-active-directory-b2c yang dapat dikonfigurasi:

Nama Deskripsi
spring.cloud.azure.active-directory.b2c.app-id-uri URI ID aplikasi yang mungkin digunakan dalam klaim "aud" token.
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters Parameter tambahan untuk autentikasi.
spring.cloud.azure.active-directory.b2c.author-clients Tentukan konfigurasi klien.
spring.cloud.azure.active-directory.b2c.base-uri Uri dasar titik akhir Azure AD B2C.
musim semi.cloud.azure.aktif-direktori.b2c.kredensial Informasi kredensial Azure AD B2C.
musim semi.cloud.azure.active-directory.b2c.jwt-connect-timeout Batas Waktu Koneksi untuk panggilan URL Jarak Jauh JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-read-timeout Baca Batas Waktu untuk panggilan URL Jarak Jauh JWKSet.
spring.cloud.azure.active-directory.b2c.jwt-size-limit Batas ukuran dalam Byte dari panggilan URL Jarak Jauh JWKSet.
spring.cloud.azure.active-directory.b2c.login-flow Tentukan kunci alur masuk utama. Nilai defaultnya adalah sign-up-or-sign-in.
spring.cloud.azure.active-directory.b2c.logout-success-url Alihkan URL setelah keluar. Nilai defaultnya adalah http://localhost:8080/login.
musim semi.cloud.azure.aktif-direktori.b2c.profil Informasi profil Azure AD B2C.
spring.cloud.azure.active-directory.b2c.reply-url URL Balasan setelah mendapatkan kode otorisasi. Nilai defaultnya adalah {baseUrl}/login/oauth2/code/.
spring.cloud.azure.active-directory.b2c.user-flows Alur pengguna.
musim semi.cloud.azure.aktif-direktori.b2c.nama-pengguna nama-atribut Nama atribut nama pengguna.

Untuk konfigurasi lengkap, periksa properti konfigurasi Spring Cloud Azure.

Penggunaan dasar

Aplikasi web adalah aplikasi berbasis web apa pun yang memungkinkan pengguna untuk masuk dengan ID Microsoft Entra, sedangkan server sumber daya akan menerima atau menolak akses setelah memvalidasi access_token diperoleh dari ID Microsoft Entra. Kami akan membahas 4 skenario dalam panduan ini:

  1. Mengakses aplikasi web.

  2. Aplikasi web mengakses server sumber daya.

  3. Mengakses server sumber daya.

  4. Server sumber daya yang mengakses server sumber daya lainnya.

Penggunaan 1: Mengakses aplikasi web

Skenario ini menggunakan kode otorisasi OAuth 2.0 memberikan alur untuk masuk ke pengguna dengan pengguna Azure AD B2C Anda.

Pilih Azure AD B2C dari menu portal, pilih aplikasi , lalu pilih Tambahkan.

Tentukan Nama aplikasi Anda (seperti ), tambahkan untukURL Balasan , rekam ID Aplikasi sebagai Anda, lalu pilih Simpan.

Pilih Kunci dari aplikasi Anda, pilih Hasilkan kunci untuk menghasilkan , lalu pilih Simpan.

Pilih alur pengguna di sebelah kiri Anda, lalu pilih Alur pengguna baru.

Pilih Daftar atau di, Pengeditan profil, dan Pengaturan ulang kata sandi untuk membuat alur pengguna masing-masing. Tentukan alur pengguna Anda Nama dan Atribut pengguna dan klaim, lalu pilih Buat.

Pilih izin API Tambahkan izinMicrosoft API, pilih Microsoft Graph, pilih Izin yang didelegasikan, pilih izin offline_access dan openid, lalu pilih Tambahkan izin untuk menyelesaikan proses.

Berikan persetujuan admin untuk izin Grafik .

cuplikan layar portal Microsoft Azure memperlihatkan layar izin API untuk aplikasi, dengan izin grafik disorot.

Tambahkan dependensi berikut ke file pom.xml Anda.

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

Tambahkan properti ke file application.yml Anda menggunakan nilai yang Anda buat sebelumnya, seperti yang diperlihatkan dalam contoh berikut:

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}

Tulis kode Java Anda.

Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:

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

Untuk kode konfigurasi keamanan, Anda dapat merujuk ke contoh berikut:

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

Salin home.html dari sampel aad-b2c-web-application, dan ganti PROFILE_EDIT_USER_FLOW dan PASSWORD_RESET_USER_FLOW dengan nama alur pengguna yang Anda gunakan sebelumnya.

Buat dan uji aplikasi Anda. Biarkan Webapp berjalan pada port 8080.

Setelah aplikasi Anda dibangun dan dimulai oleh Maven, buka http://localhost:8080/ di browser web. Anda harus diarahkan ke halaman masuk.

Pilih tautan dengan alur pengguna masuk. Anda harus dialihkan Azure AD B2C untuk memulai proses autentikasi.

Setelah berhasil masuk, Anda akan melihat sampel home page dari browser.

Penggunaan 2: Aplikasi web yang mengakses server sumber daya

Skenario ini didasarkan pada skenario Mengakses aplikasi web untuk memungkinkan aplikasi mengakses sumber daya lain. Skenario ini alur pemberian kredensial klien OAuth 2.0.

Pilih Azure AD B2C dari menu portal, pilih aplikasi , lalu pilih Tambahkan.

Tentukan Nama aplikasi Anda (seperti ), rekam ID Aplikasi sebagai Anda, lalu pilih Simpan.

Pilih Kunci dari aplikasi Anda, pilih Hasilkan kunci untuk menghasilkan , lalu pilih Simpan.

Pilih Mengekspos API dari panel navigasi, lalu pilih Atur. Rekam URI ID Aplikasi sebagai Anda, lalu pilih Simpan.

Pilih Manifes dari panel navigasi, lalu tempelkan segmen JSON berikut ke dalam array appRoles. Rekam URI ID Aplikasi sebagai WEB_API_A_APP_ID_URLAnda , catat nilai peran aplikasi sebagai WEB_API_A_ROLE_VALUEAnda, lalu pilih Simpan.

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

Pilih izin API >Tambahkan izin>API Saya, pilih nama aplikasi WebApiA, pilih Izin Aplikasi, pilih izin WebApiA.SampleScope, lalu pilih Tambahkan izin untuk menyelesaikan proses.

Berikan persetujuan admin untuk izin WebApiA .

cuplikan layar portal Microsoft Azure memperlihatkan layar izin API aplikasi.

Tambahkan dependensi berikut berdasarkan Mengakses aplikasi web skenario.

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

Tambahkan konfigurasi berikut berdasarkan Mengakses aplikasi web skenario.

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

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Tulis kode Java Webapp Anda.

Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:

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

Kode konfigurasi keamanan sama seperti dalam skenario Mengakses aplikasi web. Tambahkan webClient kacang lain sebagai berikut:

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

Untuk menulis kode Java WebApiA Anda, lihat bagian Mengakses server sumber daya.

Buat dan uji aplikasi Anda. Biarkan Webapp dan WebApiA berjalan pada 8080 port dan 8081 masing-masing. Mulai aplikasi Webapp dan WebApiA. Kembali ke halaman beranda setelah berhasil masuk. Anda kemudian dapat mengakses http://localhost:8080/webapp/webApiA untuk mendapatkan respons sumber daya WebApiA.

Penggunaan 3: Mengakses server sumber daya

Skenario ini tidak mendukung login. Cukup lindungi server dengan memvalidasi token akses, dan jika valid, server melayani permintaan.

Untuk membangun izin WebApiA Anda, lihat Penggunaan 2: Aplikasi Web Mengakses Server Sumber Daya.

Tambahkan izin WebApiA dan berikan persetujuan admin untuk aplikasi web Anda.

Tambahkan dependensi berikut ke file pom.xml Anda.

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

Tambahkan konfigurasi berikut.

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}

Nota

Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.

Tulis kode Java Anda.

Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:

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

Untuk kode konfigurasi keamanan, Anda dapat merujuk ke contoh berikut:

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

Buat dan uji aplikasi Anda. Biarkan WebApiA berjalan pada port 8081. Dapatkan token akses untuk sumber daya webApiA lalu akses http://localhost:8081/webApiA/sample sebagai header otorisasi Pembawa.

Penggunaan 4: Server sumber daya yang mengakses server sumber daya lain

Skenario ini adalah peningkatan Mengakses server sumber daya, dan mendukung akses ke sumber daya aplikasi lain, berdasarkan alur kredensial klien OAuth2.

Mengacu pada langkah-langkah sebelumnya, kami membuat aplikasi WebApiB dan mengekspos izin aplikasi 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"
}

Berikan persetujuan admin untuk izin WebApiB.

cuplikan layar portal Microsoft Azure memperlihatkan layar izin API WebApiA aplikasi.

Berdasarkan Mengakses server sumber daya, tambahkan dependensi berikut ke file pom.xml Anda.

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

Tambahkan konfigurasi berikut berdasarkan Mengakses konfigurasi skenario server sumber daya.

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

Tulis kode Java Anda.

Untuk kode pengontrol WebApiA, Anda dapat merujuk ke contoh berikut:

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

Untuk kode pengontrol WebApiB, Anda dapat merujuk ke contoh berikut:

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

Kode konfigurasi keamanan sama dengan Mengakses server sumber daya skenario, webClient kacang lain ditambahkan sebagai berikut

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

Buat dan uji aplikasi Anda. Biarkan WebApiA dan WebApiB berjalan pada 8081 port dan 8082 masing-masing. Mulai aplikasi WebApiA dan WebApiB, dapatkan token akses untuk sumber daya webApiA, dan akses http://localhost:8081/webApiA/webApiB/sample sebagai header otorisasi Pembawa.

Sampel

Untuk informasi selengkapnya, lihat sampel spring-cloud-azure-starter-active-directory-b2c .