Dukungan Spring Cloud Azure untuk Spring Security

Artikel ini berlaku untuk: ✔️ Versi 4.14.0 ✔️ Versi 5.8.0

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 alur pemberian kode otorisasi OAuth 2.0 untuk masuk ke pengguna dengan akun Microsoft.

Diagram Sistem

System diagram for a standalone web application.

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>

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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {

    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .anyRequest().authenticated();
        // Do some custom configuration
    }
}
Mengotorisasi akses menurut peran aplikasi

Buat sumber daya yang diperlukan di Azure:

Catatan

Jika ingin menggunakan kontrol akses berbasis peran aplikasi, Anda tidak dapat memasukkan nama grup ke role dalam klaim. Untuk informasi selengkapnya, lihat bagian Mengonfigurasi klaim opsional grup dari Berikan 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:

  • Azure Government

  • Azure China 21Vianet

  • Azure Germany

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.

System diagram for redirect URIs.

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

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

Perbarui redirect-uri di portal Azure.

Configure Redirect URI Template.

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

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

Koneksi ke ID Microsoft Entra melalui proksi

Untuk menyambungkan ID Microsoft Entra melalui proksi, berikan RestTemplateCustomizer kacang 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

System diagram for a web application accessing resource servers.

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>

Tambahkan 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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

System diagram for standalone resource server usage.

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>

Tambahkan 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 yang dikonfigurasi client-id 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
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {
    /**
     * Add configuration logic as needed.
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
    }
}
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 titik akhir akses /scope1 , 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 titik akhir akses /app-role1 , 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 Daftarkan sertifikat Anda dengan platform identitas Microsoft kredensial sertifikat autentikasi aplikasi platform identitas Microsoft.
  2. Unggah sertifikat .pem ke aplikasi yang terdaftar di portal Azure.
  3. Konfigurasikan jalur sertifikat dan kata sandi dari . PFX atau . Sertifikat P12 .
  4. Tambahkan konfigurasi properti spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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, seperti yang active-directory 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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.

Koneksi ke ID Microsoft Entra melalui proksi

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

Sampel

Proyek sampel: aad-resource-server.

Server sumber daya mengunjungi server sumber daya lain

Diagram Sistem

System diagram for a resource server visiting other resource servers.

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>

Tambahkan 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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>

Tambahkan 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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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

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

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

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

    @Configuration
    public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {

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

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.
spring.cloud.azure.active-directory.credential.client-secret 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.
spring.cloud.azure.active-directory.jwt-connect-timeout Koneksi batas waktu 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.
spring.cloud.azure.active-directory.profile.environment 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.
spring.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 dari spring-cloud-azure-starter-active-directory:

Memiliki dependensi: spring-security-oauth2-client Memiliki dependensi: spring-security-oauth2-resource-server Nilai yang valid dari jenis aplikasi Nilai yang disimpulkan
Ya No web_application web_application
No 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.authorization-clients Tentukan konfigurasi klien.
spring.cloud.azure.active-directory.b2c.base-uri Uri dasar titik akhir Azure AD B2C.
spring.cloud.azure.active-directory.b2c.credential Informasi kredensial Azure AD B2C.
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout Koneksi batas waktu 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.
spring.cloud.azure.active-directory.b2c.profile 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.
spring.cloud.azure.active-directory.b2c.user-name-attribute-name 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.

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

Penggunaan 1: Mengakses aplikasi web

Skenario ini menggunakan alur pemberian kode otorisasi OAuth 2.0 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 webapp), tambahkan http://localhost:8080/login/oauth2/code/ untuk URL Balasan, rekam ID Aplikasi sebagai AndaWEB_APP_AZURE_CLIENT_ID, lalu pilih Simpan.

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

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

Pilih Daftar atau masuk, Pengeditan profil, dan Pengaturan ulang kata sandi untuk membuat alur pengguna masing-masing. Tentukan nama alur pengguna dan atribut dan klaim Pengguna Anda, lalu pilih Buat.

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

Memberikan persetujuan admin untuk izin Graph.

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

Tambahkan dependensi berikut ke file pom.xml.

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

Tambahkan properti ke file application.yml Anda menggunakan nilai yang Anda buat sebelumnya, seperti yang ditunjukkan 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:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

   private final AadB2cOidcLoginConfigurer configurer;

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

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

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. Mari kita Webapp jalankan pada port 8080.

Setelah aplikasi 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 diarahkan 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 adalah alur pemberian info masuk klien OAuth 2.0.

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

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

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

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

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

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

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

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.

Azure portal screenshot showing application API permissions screen.

Tambahkan dependensi berikut berdasarkan skenario Mengakses aplikasi web.

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

Tambahkan konfigurasi berikut berdasarkan skenario Mengakses aplikasi web.

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

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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 Webapp .

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 kacang webClient 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 Anda WebApiA , lihat bagian Mengakses server sumber daya.

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

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 Anda WebApiA , lihat Penggunaan 2: Aplikasi Web Mengakses Server Sumber Daya.

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

Tambahkan dependensi berikut ke file pom.xml.

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

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}

Catatan

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 (akun pribadi dan organisasi) yang salah dari 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:

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

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

Buat dan uji aplikasi Anda. Mari kita WebApiA jalankan pada port 8081. Dapatkan token akses untuk webApiA sumber daya 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 WebApiB aplikasi dan mengekspos izin WebApiB.SampleScopeaplikasi .

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

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

Memberikan persetujuan admin untuk WebApiB izin.

Azure portal screenshot showing application WebApiA API permissions screen.

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 konfigurasi skenario Mengakses 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.

WebApiA Untuk kode pengontrol, 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.");
   }
}

WebApiB Untuk kode pengontrol, 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 skenario server sumber daya, kacang webClient 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 jalankan masing-masing pada port 8081 dan 8082 . WebApiA Mulai aplikasi dan WebApiB , dapatkan token akses untuk webApiA sumber daya, 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.