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
Membuat sumber daya yang diperlukan di Azure
Baca Mulai Cepat: Mendaftarkan aplikasi dengan platform identitas Microsoft.
Membuat pendaftaran aplikasi. Dapatkan
AZURE_TENANT_ID
,AZURE_CLIENT_ID
, danAZURE_CLIENT_SECRET
.Atur
redirect URI
keAPPLICATION_BASE_URI/login/oauth2/code/
- misalnyahttp://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:
Baca Menambahkan peran aplikasi ke aplikasi Anda dan menerimanya di token.
Buat peran aplikasi dengan parameter berikut:
- Nama tampilan: Admin
- Jenis anggota yang diizinkan: Pengguna/Grup
- Nilai: Admin
- Apakah Anda ingin mengaktifkan peran aplikasi ini: ya
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.
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.
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
Membuat Sumber Daya yang Diperlukan di Azure
Baca Mulai Cepat: Mendaftarkan aplikasi dengan platform identitas Microsoft.
Membuat pendaftaran aplikasi. Dapatkan
AZURE_TENANT_ID
,AZURE_CLIENT_ID
, danAZURE_CLIENT_SECRET
.Atur
redirect URI
keAPPLICATION_BASE_URI/login/oauth2/code/
, misalnyahttp://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
Membuat sumber daya yang diperlukan di Azure
Baca Mulai Cepat: Mendaftarkan aplikasi dengan platform identitas Microsoft.
Membuat pendaftaran aplikasi. Dapatkan
AZURE_CLIENT_ID
.Baca Mulai Cepat: Mengonfigurasi aplikasi untuk mengekspos API web.
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.
Anda akan mendapatkan 401 tanpa token akses.
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 sebelumnbf
.exp
: Waktu saat ini tidak dapat setelahexp
.aud
: Jikaspring.cloud.azure.active-directory.credential.client-id
atauspring.cloud.azure.active-directory.credential.app-id-uri
dikonfigurasi, audiens harus sama dengan yang dikonfigurasiclient-id
atauapp-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
Buat sumber daya yang diperlukan di Azure.
Baca Mulai Cepat: Mengonfigurasi aplikasi untuk mengekspos API web.
Mengekspos API web dengan cakupan bernama
Scope1
.
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 berisiScope1
.
Memvalidasi izin menurut peran aplikasi
Buat sumber daya yang diperlukan di Azure.
Baca Menambahkan peran aplikasi ke aplikasi Anda dan menerimanya di token.
Buat peran aplikasi dengan parameter berikut:
- Nama tampilan: Setujui1
- Jenis anggota yang diizinkan: Pengguna/Grup
- Nilai: AppRole1
- Apakah Anda ingin mengaktifkan peran aplikasi ini: ya
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 berisiAppRole1
.
Menggunakan autentikasi klien JWT
Untuk menggunakan JSON Web Token (JWT) untuk autentikasi klien, gunakan langkah-langkah berikut:
- Lihat bagian Daftarkan sertifikat Anda dengan platform identitas Microsoft kredensial sertifikat autentikasi aplikasi platform identitas Microsoft.
- Unggah sertifikat .pem ke aplikasi yang terdaftar di portal Azure.
- Konfigurasikan jalur sertifikat dan kata sandi dari . PFX atau . Sertifikat P12 .
- 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
Membuat sumber daya yang diperlukan di Azure
Baca Mulai Cepat: Mendaftarkan aplikasi dengan platform identitas Microsoft.
Membuat pendaftaran aplikasi. Dapatkan
AZURE_TENANT_ID
,AZURE_CLIENT_ID
, danAZURE_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
Baca Mulai Cepat: Mendaftarkan aplikasi dengan platform identitas Microsoft.
Membuat pendaftaran aplikasi. Dapatkan
AZURE_TENANT_ID
,AZURE_CLIENT_ID
, danAZURE_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:
Mengakses aplikasi web.
Aplikasi web mengakses server sumber daya.
Mengakses server sumber daya.
Server sumber daya yang mengakses server sumber daya lainnya.
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.
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"
}
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.
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.SampleScope
aplikasi .
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
}
Memberikan persetujuan admin untuk WebApiB
izin.
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk