Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 komponen 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 memungkinkan pengguna masuk 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 URIkeAPPLICATION_BASE_URI/login/oauth2/code/- misalnyahttp://localhost:8080/login/oauth2/code/. Tailing/tersebut diperlukan.
Menambahkan dependensi yang diperlukan
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
Menambahkan properti yang diperlukan
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Sekarang, mulai aplikasi Anda dan akses aplikasi Anda melalui browser. Anda akan diarahkan ke halaman masuk Microsoft.
Penggunaan tingkat lanjut
Menambahkan konfigurasi keamanan tambahan
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())
.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
// Do some custom configuration.
return http.build();
}
}
Mengotorisasi akses menurut peran aplikasi
Buat sumber daya yang diperlukan di Azure:
Baca Tambahkan peran aplikasi ke dalam aplikasi Anda dan terima dalam 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
Nota
Jika ingin menggunakan kontrol akses berbasis peran aplikasi, Anda tidak dapat memasukkan nama grup ke dalam klaim role. Untuk informasi selengkapnya, lihat bagian Mengonfigurasi klaim opsional grup dari Memberikan klaim opsional ke aplikasi Anda.
Lindungi metode tertentu.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Mengotorisasi akses menurut nama grup atau ID grup
Tambahkan properti konfigurasi terkait.
spring:
cloud:
azure:
active-directory:
enabled: true
user-group:
allowed-group-names: group1_name_1, group2_name_2
# 1. If allowed-group-ids == all, then all group ID will take effect.
# 2. If "all" is used, we should not configure other group ids.
# 3. "all" is only supported for allowed-group-ids, not supported for allowed-group-names.
allowed-group-ids: group_id_1, group_id_2
Lindungi metode tertentu.
@Controller
public class RoleController {
@GetMapping("group1")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group1')")
public String group1() {
return "group1 message";
}
@GetMapping("group2")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group2')")
public String group2() {
return "group2 message";
}
@GetMapping("group1Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group1-id>')")
public String group1Id() {
return "group1Id message";
}
@GetMapping("group2Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group2-id>')")
public String group2Id() {
return "group2Id message";
}
}
Menggunakan National Azure alih-alih Global Azure
Sekarang kecuali cloud Azure global, ID Microsoft Entra disebarkan di cloud nasional berikut:
Azure Government
Azure Tiongkok 21Vianet
Azure Jerman
Berikut adalah sampel menggunakan Azure Tiongkok 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.
Konfigurasikan templat URI pengalihan
Pengembang dapat menyesuaikan uri pengalihan.
Tambahkan properti redirect-uri-template di file application.yml Anda.
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Perbarui redirect-uri di portal Microsoft Azure.
Setelah kita mengatur redirect-uri-template, kita perlu memperbarui pembuat keamanan:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())
.oauth2Login(login -> login.loginProcessingUrl("${REDIRECT-URI-TEMPLATE}"))
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
// @formatter:on
return http.build();
}
}
Menyambungkan ke ID Microsoft Entra melalui proksi
Untuk menghubungkan Microsoft Entra ID melalui proksi, sediakan bean RestTemplateCustomizer seperti yang ditunjukkan dalam contoh berikut:
@Configuration
class DemoConfiguration {
@Bean
public RestTemplateCustomizer proxyRestTemplateCustomizer() {
return (RestTemplate restTemplate) -> {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
restTemplate.setRequestFactory(requestFactory);
};
}
}
Contoh
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 URIkeAPPLICATION_BASE_URI/login/oauth2/code/, misalnyahttp://localhost:8080/login/oauth2/code/. Tailing/tersebut diperlukan.
Menambahkan dependensi yang diperlukan
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
Menambahkan properti yang diperlukan
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
scopes: https://graph.microsoft.com/Analytics.Read, email
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Di sini, graph adalah nama OAuth2AuthorizedClient, scopes berarti cakupan izin yang diperlukan untuk memberikan persetujuan saat login.
Menggunakan OAuth2AuthorizedClient di aplikasi Anda
public class Demo {
@GetMapping("/graph")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient) {
// toJsonString() is just a demo.
// oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.
return toJsonString(graphClient);
}
}
Sekarang, mulai aplikasi Anda dan akses aplikasi Anda di browser. Kemudian, Anda akan diarahkan ke halaman masuk Microsoft.
Penggunaan tingkat lanjut
Alur Kredensial Klien
Alur default adalah alur kode otorisasi, jika Anda ingin menggunakan alur kredensial klien , Anda dapat mengonfigurasi seperti ini:
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
authorization-grant-type: client_credentials # Change type to client_credentials
scopes: https://graph.microsoft.com/Analytics.Read, email
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Mengakses beberapa server sumber daya
Dalam satu aplikasi web, Anda dapat mengakses beberapa server sumber daya dengan mengonfigurasi seperti ini:
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
resource-server-1:
scopes: # Scopes for resource-server-1
resource-server-2:
scopes: # Scopes for resource-server-2
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Kemudian Anda dapat menggunakan OAuth2AuthorizedClient dalam aplikasi seperti ini
public class Demo {
@GetMapping("/resource-server-1")
@ResponseBody
public String graph1(
@RegisteredOAuth2AuthorizedClient("resource-server-1") OAuth2AuthorizedClient client) {
return callResourceServer1(client);
}
@GetMapping("/resource-server-2")
@ResponseBody
public String graph2(
@RegisteredOAuth2AuthorizedClient("resource-server-2") OAuth2AuthorizedClient client) {
return callResourceServer2(client);
}
}
Contoh
Contoh proyek: aad-web-application.
Mengakses server sumber daya
Skenario ini tidak mendukung login, cukup lindungi server dengan memvalidasi token akses. Jika token akses valid, server melayani permintaan.
Diagram Sistem
diagram sistem
Membuat sumber daya yang diperlukan di Azure
Baca Mulai cepat: mendaftarkan aplikasi dengan platform identitas Microsoft.
Membuat pendaftaran aplikasi. Dapatkan
AZURE_CLIENT_ID.Baca Panduan mulai cepat: Mengonfigurasi aplikasi untuk menyediakan 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>
Menambahkan properti yang diperlukan
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
Sekarang mulai aplikasi Anda dan akses api web aplikasi Anda.
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 boleh setelahexp.aud: Jikaspring.cloud.azure.active-directory.credential.client-idatauspring.cloud.azure.active-directory.credential.app-id-uridikonfigurasi, audiens harus sama denganclient-idyang dikonfigurasi 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
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2ResourceServerSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())
.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
// @formatter:on
return http.build();
}
}
Memvalidasi izin menurut cakupan
Buat sumber daya yang diperlukan di Azure.
Baca Mulai Cepat: Mengonfigurasi aplikasi untuk menyediakan 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, saat mengakses endpoint /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 Tambahkan peran aplikasi ke dalam aplikasi Anda dan terima dalam token.
Buat peran aplikasi dengan parameter berikut:
- Nama tampilan: AppRole1
- 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, saat mengakses endpoint /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 Mendaftarkan sertifikat Anda dengan platform identitas Microsoft dari kredensial sertifikat autentikasi aplikasi platform identitas Microsoft.
- Unggah sertifikat .pem
ke aplikasi yang terdaftar di portal Microsoft Azure. - Konfigurasikan jalur dan kata sandi sertifikat .PFX atau .P12.
- Tambahkan properti konfigurasi
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwtpada klien agar dapat diautentikasi melalui autentikasi klien JWT.
Contoh file konfigurasi berikut adalah untuk skenario aplikasi web. Informasi sertifikat dikonfigurasi dalam properti global.
spring:
cloud:
azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
active-directory:
enabled: true
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Anda juga dapat mengonfigurasi informasi sertifikat di properti layanan active-directory, seperti yang ditunjukkan dalam contoh ini:
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Menyambungkan ke ID Microsoft Entra melalui proksi
Untuk menghubungkan Microsoft Entra ID melalui proksi, sediakan bean RestTemplateCustomizer. Untuk informasi selengkapnya, lihat bagian Menyambungkan ke ID Microsoft Entra melalui proksi.
Contoh
Contoh proyek: aad-resource-server.
Server sumber daya yang mengakses 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>
Menambahkan properti yang diperlukan
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
scopes:
- https://graph.microsoft.com/User.Read
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Menggunakan OAuth2AuthorizedClient di aplikasi Anda
public class SampleController {
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
return callMicrosoftGraphMeEndpoint(graph);
}
}
Contoh
Contoh proyek: 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>
Menambahkan properti yang diperlukan
Atur properti spring.cloud.azure.active-directory.application-type ke web_application_and_resource_server, dan tentukan jenis otorisasi untuk setiap klien otorisasi.
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
app-id-uri: ${WEB_API_ID_URI}
application-type: web_application_and_resource_server # This is required.
authorization-clients:
graph:
authorizationGrantType: authorization_code # This is required.
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Tentukan SecurityFilterChain
Konfigurasikan beberapa instans SecurityFilterChain.
AadWebApplicationAndResourceServerConfig berisi dua konfigurasi rantai filter keamanan untuk server sumber daya dan aplikasi web.
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {
@Bean
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())
// All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.
.securityMatcher("/api/**")
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
return http.build();
}
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())
.authorizeHttpRequests(auth -> auth.requestMatchers("/login").permitAll().anyRequest().authenticated());
// @formatter:on
return http.build();
}
}
Konfigurasi
Properti spring-cloud-azure-starter-active-directory yang dapat dikonfigurasi:
| 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 yang digunakan saat melakukan autentikasi service principal 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 |
Batas Waktu Koneksi untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.jwt-read-timeout |
Baca Batas Waktu untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.jwt-size-limit |
Batas ukuran dalam byte untuk panggilan URL jarak jauh JWKSet. |
spring.cloud.azure.active-directory.post-logout-redirect-uri |
URI pengalihan setelah logout. |
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 akan dikembalikan oleh AuthenticatedPrincipal#getName. Nilai defaultnya adalah "sub". |
spring.cloud.azure.active-directory.session-stateless |
Jika bernilai true, filter autentikasi stateless AadAppRoleStatelessAuthenticationFilter akan diaktifkan. 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 spring-cloud-azure-starter-active-directory:
Bergantung pada: spring-security-oauth2-client |
Memiliki ketergantungan: spring-security-oauth2-resource-server |
Nilai jenis aplikasi yang valid | Nilai yang disimpulkan |
|---|---|---|---|
| Ya | Tidak | web_application |
web_application |
| Tidak | Ya | resource_server |
resource_server |
| Ya | Ya |
web_application,resource_server,resource_server_with_obo,web_application_and_resource_server |
resource_server_with_obo |
Spring Security dengan Azure Active Directory B2C
Azure Active Directory (Azure AD) B2C adalah layanan manajemen identitas yang memungkinkan Anda menyesuaikan dan mengontrol cara pelanggan mendaftar, masuk, dan mengelola profil mereka saat menggunakan aplikasi Anda. Azure AD B2C memungkinkan tindakan ini sekaligus melindungi identitas pelanggan Anda secara bersamaan.
Penyiapan dependensi
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Konfigurasi
Properti spring-cloud-azure-starter-active-directory-b2c yang dapat dikonfigurasi:
| Nama | Deskripsi |
|---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri |
URI ID aplikasi yang mungkin digunakan dalam klaim "aud" sebuah 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 endpoint Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.credential |
Informasi kredensial Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout |
Batas Waktu Koneksi untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout |
Baca Batas Waktu untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit |
Batas ukuran dalam byte untuk 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 untuk 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 dengan akun pengguna Azure AD B2C Anda.
Pilih Azure AD B2C dari menu portal, pilih aplikasi , lalu pilih Tambahkan.
Tentukan Nama
Pilih Kunci dari aplikasi Anda, pilih Buat kunci untuk membuat , lalu pilih Simpan.
Pilih alur pengguna di sebelah kiri Anda, lalu pilih Alur pengguna baru.
Pilih Daftar atau di, Pengeditan profil, dan Pengaturan ulang kata sandi untuk membuat alur pengguna masing-masing. Tentukan alur pengguna Anda Nama dan Atribut pengguna dan klaim, lalu pilih Buat.
Pilih Izin APITambahkan izinAPI Microsoft, pilih Microsoft Graph, pilih Izin yang didelegasikan, pilih izin offline_access dan openid, lalu pilih Tambahkan izin untuk menyelesaikan proses.
Berikan persetujuan admin untuk izin Graph.
Tambahkan dependensi berikut ke file pom.xml Anda.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
</dependency>
</dependencies>
Tambahkan properti ke file application.yml Anda menggunakan nilai yang Anda buat sebelumnya, seperti yang diperlihatkan dalam contoh berikut:
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
authenticate-additional-parameters:
domain_hint: xxxxxxxxx # optional
login_hint: xxxxxxxxx # optional
prompt: [login,none,consent] # optional
base-uri: ${BASE_URI}
credential:
client-id: ${WEBAPP_AZURE_CLIENT_ID}
client-secret: ${WEBAPP_AZURE_CLIENT_SECRET}
login-flow: ${LOGIN_USER_FLOW_KEY} # default to sign-up-or-sign-in, will look up the user-flows map with provided key.
logout-success-url: ${LOGOUT_SUCCESS_URL}
user-flows:
${YOUR_USER_FLOW_KEY}: ${USER_FLOW_NAME}
user-name-attribute-name: ${USER_NAME_ATTRIBUTE_NAME}
Tulis kode Java Anda.
Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:
@Controller
public class WebController {
private void initializeModel(Model model, OAuth2AuthenticationToken token) {
if (token != null) {
final OAuth2User user = token.getPrincipal();
model.addAllAttributes(user.getAttributes());
model.addAttribute("grant_type", user.getAuthorities());
model.addAttribute("name", user.getName());
}
}
@GetMapping(value = { "/", "/home" })
public String index(Model model, OAuth2AuthenticationToken token) {
initializeModel(model, token);
return "home";
}
}
Untuk kode konfigurasi keamanan, Anda dapat merujuk ke contoh berikut:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class WebSecurityConfiguration {
private final AadB2cOidcLoginConfigurer configurer;
public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.with(configurer, Customizer.withDefaults());
// @formatter:on
return http.build();
}
}
Salin home.html dari sampel aad-b2c-web-application, dan ganti PROFILE_EDIT_USER_FLOW dan PASSWORD_RESET_USER_FLOW dengan nama alur pengguna yang Anda gunakan sebelumnya.
Buat dan uji aplikasi Anda. Biarkan Webapp berjalan pada port 8080.
Setelah aplikasi Anda dibangun dan dimulai oleh Maven, buka http://localhost:8080/ di browser web. Anda harus diarahkan ke halaman masuk.
Pilih tautan dengan alur login pengguna. Anda harus dialihkan Azure AD B2C untuk memulai proses autentikasi.
Setelah berhasil masuk, Anda akan melihat sampel home page dari browser.
Penggunaan 2: Aplikasi web yang mengakses server sumber daya
Skenario ini didasarkan pada skenario Mengakses aplikasi web untuk memungkinkan aplikasi mengakses sumber daya lain. Skenario ini alur pemberian kredensial klien OAuth 2.0.
Pilih Azure AD B2C dari menu portal, pilih aplikasi , lalu pilih Tambahkan.
Tentukan Nama
Pilih Kunci dari aplikasi Anda, pilih Buat kunci untuk membuat , lalu pilih Simpan.
Pilih Mengekspos API dari panel navigasi, lalu pilih Atur. Catat Application ID URI sebagai , lalu pilih Simpan.
Pilih Manifes dari panel navigasi, lalu tempelkan segmen JSON berikut ke dalam array appRoles. Rekam URI ID Aplikasi sebagai WEB_API_A_APP_ID_URLAnda , catat nilai peran aplikasi sebagai WEB_API_A_ROLE_VALUEAnda, lalu pilih Simpan.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
}
Pilih izin API >Tambahkan izin>API Saya, pilih nama aplikasi WebApiA, pilih Izin Aplikasi, pilih izin WebApiA.SampleScope, lalu pilih Tambahkan izin untuk menyelesaikan proses.
Berikan persetujuan administrator untuk izin WebApiA.
Tambahkan dependensi berikut berdasarkan Mengakses aplikasi web skenario.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Tambahkan konfigurasi berikut berdasarkan Mengakses aplikasi web skenario.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: <tenant>
authorization-clients:
${RESOURCE_SERVER_A_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_A_APP_ID_URL}/.default
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Tulis kode Java Webapp Anda.
Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:
class Demo {
/**
* Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi A.
*/
@GetMapping("/webapp/webApiA")
public String callWebApiA() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiA"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiA(), request '/webApiA/sample' returned: {}", body);
return "Request '/webApiA/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
Kode konfigurasi keamanan sama seperti dalam skenario Mengakses aplikasi web. Tambahkan webClient kacang lain sebagai berikut:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Untuk menulis kode Java WebApiA Anda, lihat bagian Mengakses server sumber daya.
Buat dan uji aplikasi Anda. Biarkan Webapp dan WebApiA berjalan pada 8080 port dan 8081 masing-masing. Mulai aplikasi Webapp dan WebApiA. Kembali ke halaman beranda setelah berhasil masuk. Anda kemudian dapat mengakses http://localhost:8080/webapp/webApiA untuk mendapatkan respons sumber daya WebApiA.
Penggunaan 3: Mengakses server sumber daya
Skenario ini tidak mendukung login. Cukup lindungi server dengan memvalidasi token akses, dan jika valid, server melayani permintaan.
Untuk menyiapkan izin WebApiA Anda, lihat Kasus Penggunaan 2: Aplikasi Web yang Mengakses Server Sumber Daya.
Tambahkan izin WebApiA dan berikan persetujuan admin untuk aplikasi web Anda.
Tambahkan dependensi berikut ke file pom.xml Anda.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Tambahkan konfigurasi berikut.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: <tenant>
app-id-uri: ${APP_ID_URI} # If you're using v1.0 token, configure app-id-uri for `aud` verification
credential:
client-id: ${AZURE_CLIENT_ID} # If you're using v2.0 token, configure client-id for `aud` verification
user-flows:
sign-up-or-sign-in: ${SIGN_UP_OR_SIGN_IN_USER_FLOW_NAME}
Nota
Nilai yang diizinkan untuk tenant-id adalah: common, organizations, consumers, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Tulis kode Java Anda.
Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:
class Demo {
/**
* webApiA resource api for web app
* @return test content
*/
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
@GetMapping("/webApiA/sample")
public String webApiASample() {
LOGGER.info("Call webApiASample()");
return "Request '/webApiA/sample'(WebApi A) returned successfully.";
}
}
Untuk kode konfigurasi keamanan, Anda dapat merujuk ke contoh berikut:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class ResourceServerConfiguration {
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
jwtGrantedAuthoritiesConverter.setAuthorityPrefix("APPROLE_");
authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
// @formatter:off
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.oauth2ResourceServer(o -> o.jwt(j -> j.jwtAuthenticationConverter(authenticationConverter)));
// @formatter:on
return http.build();
}
}
Buat dan uji aplikasi Anda. Biarkan WebApiA berjalan pada port 8081. Dapatkan token akses untuk sumber daya webApiA, lalu gunakan token tersebut untuk mengakses http://localhost:8081/webApiA/sample sebagai header otorisasi Bearer.
Penggunaan 4: Server sumber daya yang mengakses server sumber daya lain
Skenario ini adalah peningkatan Mengakses server sumber daya, dan mendukung akses ke sumber daya aplikasi lain, berdasarkan alur kredensial klien OAuth2.
Mengacu pada langkah-langkah sebelumnya, kami membuat aplikasi WebApiB dan mengekspos izin aplikasi WebApiB.SampleScope.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
}
Berikan persetujuan admin untuk izin WebApiB.
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.
Untuk kode pengontrol WebApiA, Anda dapat merujuk ke contoh berikut:
public class SampleController {
/**
* Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi B.
*/
@GetMapping("/webApiA/webApiB/sample")
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
public String callWebApiB() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiB"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
Untuk kode pengontrol WebApiB, Anda dapat merujuk ke contoh berikut:
public class SampleController {
/**
* webApiB resource api for other web application
* @return test content
*/
@PreAuthorize("hasAuthority('APPROLE_WebApiB.SampleScope')")
@GetMapping("/webApiB/sample")
public String webApiBSample() {
LOGGER.info("Call webApiBSample()");
return "Request '/webApiB/sample'(WebApi B) returned successfully.";
}
}
Kode konfigurasi keamanan sama seperti pada skenario Mengakses server sumber daya; bean lain, webClient, ditambahkan sebagai berikut
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Buat dan uji aplikasi Anda. Biarkan WebApiA dan WebApiB berjalan pada 8081 port dan 8082 masing-masing. Jalankan aplikasi WebApiA dan WebApiB, dapatkan token akses untuk sumber daya webApiA, dan akses http://localhost:8081/webApiA/webApiB/sample dengan header otorisasi Bearer.
Contoh
Untuk informasi selengkapnya, lihat spring-cloud-azure-starter-active-directory-b2c contoh.