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 potongan dasar.
Azure menawarkan platform hebat untuk mendemokratisasi perjalanan pengembangan aplikasi Anda, karena tidak hanya menawarkan layanan identitas berbasis cloud, tetapi juga integrasi mendalam dengan sisa ekosistem Azure.
Spring Security telah memudahkan untuk mengamankan aplikasi berbasis Spring Anda dengan abstraksi yang kuat dan antarmuka yang dapat diperluas. Namun, sekuat kerangka kerja Spring, kerangka kerja tersebut tidak disesuaikan dengan penyedia identitas tertentu.
spring-cloud-azure-starter-active-directory
menyediakan cara paling optimal untuk menghubungkan aplikasi web Anda ke penyewa ID Microsoft Entra (ID Microsoft Entra singkatnya) dan melindungi server sumber daya Anda dengan ID Microsoft Entra. Ini menggunakan protokol Oauth 2.0 untuk melindungi aplikasi web dan server sumber daya.
Mengakses aplikasi web
Skenario ini menggunakan kode otorisasi OAuth 2.0 memberikan alur untuk masuk ke pengguna dengan akun Microsoft.
Diagram Sistem
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>
Menambahkan properti yang diperlukan
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Sekarang, mulai aplikasi Anda dan akses aplikasi Anda melalui browser. Anda akan diarahkan ke halaman masuk Microsoft.
Penggunaan tingkat lanjut
Menambahkan konfigurasi keamanan tambahan
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {
/**
* Add configuration logic as needed.
*/
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests()
.anyRequest().authenticated();
// Do some custom configuration.
return http.build();
}
}
Mengotorisasi akses menurut peran aplikasi
Buat sumber daya yang diperlukan di Azure:
Baca Tambahkan peran aplikasi ke aplikasi Anda dan terima 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
Nota
Jika ingin menggunakan kontrol akses berbasis peran aplikasi, Anda tidak dapat memasukkan nama grup ke dalam klaim role
. Untuk informasi selengkapnya, lihat bagian Mengonfigurasi klaim opsional grup dari Memberikan klaim opsional ke aplikasi Anda.
Lindungi metode tertentu.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Mengotorisasi akses menurut nama grup atau ID grup
Tambahkan properti konfigurasi terkait.
spring:
cloud:
azure:
active-directory:
enabled: true
user-group:
allowed-group-names: group1_name_1, group2_name_2
# 1. If allowed-group-ids == all, then all group ID will take effect.
# 2. If "all" is used, we should not configure other group ids.
# 3. "all" is only supported for allowed-group-ids, not supported for allowed-group-names.
allowed-group-ids: group_id_1, group_id_2
Lindungi metode tertentu.
@Controller
public class RoleController {
@GetMapping("group1")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group1')")
public String group1() {
return "group1 message";
}
@GetMapping("group2")
@ResponseBody
@PreAuthorize("hasRole('ROLE_group2')")
public String group2() {
return "group2 message";
}
@GetMapping("group1Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group1-id>')")
public String group1Id() {
return "group1Id message";
}
@GetMapping("group2Id")
@ResponseBody
@PreAuthorize("hasRole('ROLE_<group2-id>')")
public String group2Id() {
return "group2Id message";
}
}
Menggunakan National Azure alih-alih Global Azure
Sekarang kecuali cloud Azure global, ID Microsoft Entra disebarkan di cloud nasional berikut:
Layanan Azure untuk Pemerintah
Azure Tiongkok 21Vianet
Azure Jerman
Berikut adalah sampel menggunakan Azure China 21Vianet.
spring:
cloud:
azure:
active-directory:
enabled: true
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn
Untuk informasi selengkapnya, lihat Penyebaran cloud nasional.
Mengonfigurasi templat URI pengalihan
Pengembang dapat menyesuaikan uri pengalihan.
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.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.oauth2Login()
.loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
.and()
.authorizeHttpRequests()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
Menyambungkan ke ID Microsoft Entra melalui proksi
Untuk menyambungkan ID Microsoft Entra melalui proksi, berikan kacang RestTemplateCustomizer
seperti yang ditunjukkan dalam contoh berikut:
@Configuration
class DemoConfiguration {
@Bean
public RestTemplateCustomizer proxyRestTemplateCustomizer() {
return (RestTemplate restTemplate) -> {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
restTemplate.setRequestFactory(requestFactory);
};
}
}
Sampel
Contoh proyek: aad-web-application.
Aplikasi web mengakses server sumber daya
Diagram Sistem
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>
Menambahkan properti yang diperlukan
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
scopes: https://graph.microsoft.com/Analytics.Read, email
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Di sini, graph
adalah nama OAuth2AuthorizedClient
, scopes
berarti cakupan yang diperlukan untuk menyetujui saat masuk.
Menggunakan OAuth2AuthorizedClient di aplikasi Anda
public class Demo {
@GetMapping("/graph")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient) {
// toJsonString() is just a demo.
// oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.
return toJsonString(graphClient);
}
}
Sekarang, mulai aplikasi Anda dan akses aplikasi Anda di browser. Kemudian, Anda akan diarahkan ke halaman masuk Microsoft.
Penggunaan tingkat lanjut
Alur Kredensial Klien
Alur default adalah alur kode otorisasi, jika Anda ingin menggunakan alur kredensial klien , Anda dapat mengonfigurasi seperti ini:
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
graph:
authorization-grant-type: client_credentials # Change type to client_credentials
scopes: https://graph.microsoft.com/Analytics.Read, email
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Mengakses beberapa server sumber daya
Dalam satu aplikasi web, Anda dapat mengakses beberapa server sumber daya dengan mengonfigurasi seperti ini:
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
authorization-clients:
resource-server-1:
scopes: # Scopes for resource-server-1
resource-server-2:
scopes: # Scopes for resource-server-2
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Kemudian Anda dapat menggunakan OAuth2AuthorizedClient
dalam aplikasi seperti ini
public class Demo {
@GetMapping("/resource-server-1")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("resource-server-1") OAuth2AuthorizedClient client) {
return callResourceServer1(client);
}
@GetMapping("/resource-server-2")
@ResponseBody
public String graph(
@RegisteredOAuth2AuthorizedClient("resource-server-2") OAuth2AuthorizedClient client) {
return callResourceServer2(client);
}
}
Sampel
Contoh proyek: aad-web-application.
Mengakses server sumber daya
Skenario ini tidak mendukung login, cukup lindungi server dengan memvalidasi token akses. Jika token akses valid, server melayani permintaan.
Diagram Sistem
diagram sistem
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>
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 dapat setelahexp
.aud
: Jikaspring.cloud.azure.active-directory.credential.client-id
atauspring.cloud.azure.active-directory.credential.app-id-uri
dikonfigurasi, audiens harus sama denganclient-id
yang 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.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and()
.authorizeHttpRequests()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
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 akses /scope1
titik akhir, 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 aplikasi Anda dan terima 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 akses /app-role1
titik akhir, 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 sertifikat dan kata sandi . PFX atau . Sertifikat P12.
- Tambahkan properti
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt
konfigurasi ke klien untuk diautentikasi melalui autentikasi klien JWT.
Contoh file konfigurasi berikut adalah untuk skenario aplikasi web. Informasi sertifikat dikonfigurasi di properti global.
spring:
cloud:
azure:
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
active-directory:
enabled: true
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Anda juga dapat mengonfigurasi informasi sertifikat di properti layanan active-directory
, seperti yang ditunjukkan dalam contoh ini:
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
client-certificate-path: ${AZURE_CERTIFICATE_PATH}
client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}
profile:
tenant-id: <tenant>
user-group:
allowed-group-names: group1,group2
allowed-group-ids: <group1-id>,<group2-id>
post-logout-redirect-uri: http://localhost:8080
authorization-clients:
azure:
client-authentication-method: private_key_jwt
arm:
client-authentication-method: private_key_jwt
scopes: https://management.core.windows.net/user_impersonation
graph:
client-authentication-method: private_key_jwt
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
webapiA:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope
webapiB:
client-authentication-method: private_key_jwt
scopes:
- ${WEB_API_B_APP_ID_URL}/.default
authorization-grant-type: client_credentials
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Menyambungkan ke ID Microsoft Entra melalui proksi
Untuk menyambungkan ID Microsoft Entra melalui proksi, berikan kacang RestTemplateCustomizer
. Untuk informasi selengkapnya, lihat bagian Menyambungkan ke ID Microsoft Entra melalui proksi.
Sampel
Proyek sampel: aad-resource-server.
Server sumber daya mengunjungi server sumber daya lain
Diagram Sistem
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);
}
}
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>
Menambahkan properti yang diperlukan
Atur properti spring.cloud.azure.active-directory.application-type
ke web_application_and_resource_server
, dan tentukan jenis otorisasi untuk setiap klien otorisasi.
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
app-id-uri: ${WEB_API_ID_URI}
application-type: web_application_and_resource_server # This is required.
authorization-clients:
graph:
authorizationGrantType: authorization_code # This is required.
scopes:
- https://graph.microsoft.com/User.Read
- https://graph.microsoft.com/Directory.Read.All
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Tentukan SecurityFilterChain
Konfigurasikan beberapa instans SecurityFilterChain
.
AadWebApplicationAndResourceServerConfig
berisi dua konfigurasi rantai filter keamanan untuk server sumber daya dan aplikasi web.
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {
@Bean
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and()
// All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.
.securityMatcher("/api/**")
.authorizeHttpRequests()
.anyRequest().authenticated();
return http.build();
}
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests()
.requestMatchers("/login").permitAll()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
Konfigurasi
Properti yang dapat dikonfigurasi dari spring-cloud-azure-starter-active-directory:
Nama | Deskripsi |
---|---|
spring.cloud.azure.active-directory.app-id-uri | URI ID Aplikasi yang mungkin digunakan dalam klaim "aud" dari id_token. |
spring.cloud.azure.active-directory.application-type | Jenis aplikasi Microsoft Entra. |
spring.cloud.azure.active-directory.authenticate-additional-parameters | Tambahkan parameter tambahan ke URL Otorisasi. |
spring.cloud.azure.active-directory.authorization-clients | Klien otorisasi OAuth2. |
Spring.cloud.azure.active-directory.credential.client-id | Id Klien untuk digunakan saat melakukan autentikasi perwakilan layanan dengan Azure. |
musim semi.cloud.azure.aktif-direktori.kredensial.rahasia-klien | Rahasia klien untuk digunakan saat melakukan autentikasi perwakilan layanan dengan Azure. |
spring.cloud.azure.active-directory.jwk-set-cache-lifespan | Masa pakai set JWK yang di-cache sebelum kedaluwarsa, defaultnya adalah 5 menit. |
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time | Waktu refresh set JWK yang di-cache sebelum kedaluwarsa, defaultnya adalah 5 menit. |
musim semi.cloud.azure.active-directory.jwt-connect-timeout | Batas Waktu Koneksi untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.jwt-read-timeout | Baca Batas Waktu untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.jwt-size-limit | Batas ukuran dalam Byte dari panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.post-logout-redirect-uri | Uri pengalihan setelah keluar. |
spring.cloud.azure.active-directory.profile.cloud-type | Nama cloud Azure untuk disambungkan. Jenis yang didukung adalah: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER. |
musim semi.cloud.azure.aktif-direktori.profil.lingkungan | Properti untuk titik akhir Microsoft Entra. |
spring.cloud.azure.active-directory.profile.tenant-id | ID Penyewa Azure. Nilai yang diizinkan untuk tenant-id adalah: common , organizations , consumers , atau ID penyewa. |
spring.cloud.azure.active-directory.redirect-uri-template | Titik Akhir Pengalihan: Digunakan oleh server otorisasi untuk mengembalikan respons yang berisi kredensial otorisasi kepada klien melalui agen pengguna pemilik sumber daya. Nilai defaultnya adalah {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map | Konfigurasikan klaim mana yang akan digunakan untuk membangun GrantedAuthority, dan awalan nilai string GrantedAuthority. Nilai defaultnya adalah: "scp" -> "SCOPE_", "roles" -> "APPROLE_". |
spring.cloud.azure.active-directory.resource-server.principal-claim-name | Konfigurasikan klaim mana dalam token akses yang dikembalikan di AuthenticatedPrincipal#getName. Nilai defaultnya adalah "sub". |
spring.cloud.azure.active-directory.session-stateless | Jika true mengaktifkan filter autentikasi stateless AadAppRoleStatelessAuthenticationFilter. Defaultnya adalah false yang mengaktifkan AadAuthenticationFilter. |
spring.cloud.azure.active-directory.user-group.allowed-group-ids | Id grup dapat digunakan untuk membuat GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.allowed-group-names | Nama grup dapat digunakan untuk membuat GrantedAuthority. |
musim semi.cloud.azure.active-directory.user-group.use-transitive-members | Jika "true", gunakan "v1.0/me/transitiveMemberOf" untuk mendapatkan anggota. Jika tidak, gunakan "v1.0/me/memberOf". Nilai defaultnya adalah false . |
spring.cloud.azure.active-directory.user-name-attribute | Tentukan klaim mana yang akan menjadi nama utama. |
Berikut adalah beberapa contoh tentang cara menggunakan properti ini:
Jenis aplikasi
Jenis aplikasi dapat disimpulkan dari dependensi: spring-security-oauth2-client
atau spring-security-oauth2-resource-server
. Jika nilai yang disimpulkan bukan nilai yang Anda inginkan, Anda dapat menentukan jenis aplikasi. Berikut adalah tabel nilai yang valid dan nilai yang disimpulkan:
Jenis aplikasi spring-cloud-azure-starter-active-directory
:
Memiliki dependensi: spring-security-oauth2-client |
Memiliki dependensi: spring-security-oauth2-resource-server |
Nilai jenis aplikasi yang valid | Nilai yang disimpulkan |
---|---|---|---|
Ya | Tidak | web_application |
web_application |
Tidak | Ya | resource_server |
resource_server |
Ya | Ya |
web_application ,resource_server ,resource_server_with_obo ,web_application_and_resource_server |
resource_server_with_obo |
Spring Security dengan Azure Active Directory B2C
Azure Active Directory (Azure AD) B2C adalah layanan manajemen identitas yang memungkinkan Anda menyesuaikan dan mengontrol cara pelanggan mendaftar, masuk, dan mengelola profil mereka saat menggunakan aplikasi Anda. Azure AD B2C memungkinkan tindakan ini sekaligus melindungi identitas pelanggan Anda secara bersamaan.
Penyiapan dependensi
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Konfigurasi
Properti spring-cloud-azure-starter-active-directory-b2c yang dapat dikonfigurasi:
Nama | Deskripsi |
---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri | URI ID aplikasi yang mungkin digunakan dalam klaim "aud" token. |
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters | Parameter tambahan untuk autentikasi. |
spring.cloud.azure.active-directory.b2c.author-clients | Tentukan konfigurasi klien. |
spring.cloud.azure.active-directory.b2c.base-uri | Uri dasar titik akhir Azure AD B2C. |
musim semi.cloud.azure.aktif-direktori.b2c.kredensial | Informasi kredensial Azure AD B2C. |
musim semi.cloud.azure.active-directory.b2c.jwt-connect-timeout | Batas Waktu Koneksi untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout | Baca Batas Waktu untuk panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit | Batas ukuran dalam Byte dari panggilan URL Jarak Jauh JWKSet. |
spring.cloud.azure.active-directory.b2c.login-flow | Tentukan kunci alur masuk utama. Nilai defaultnya adalah sign-up-or-sign-in . |
spring.cloud.azure.active-directory.b2c.logout-success-url | Alihkan URL setelah keluar. Nilai defaultnya adalah http://localhost:8080/login . |
musim semi.cloud.azure.aktif-direktori.b2c.profil | Informasi profil Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.reply-url | URL Balasan setelah mendapatkan kode otorisasi. Nilai defaultnya adalah {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.b2c.user-flows | Alur pengguna. |
musim semi.cloud.azure.aktif-direktori.b2c.nama-pengguna nama-atribut | Nama atribut nama pengguna. |
Untuk konfigurasi lengkap, periksa properti konfigurasi Spring Cloud Azure.
Penggunaan dasar
Aplikasi web adalah aplikasi berbasis web apa pun yang memungkinkan pengguna untuk masuk dengan ID Microsoft Entra, sedangkan server sumber daya akan menerima atau menolak akses setelah memvalidasi access_token diperoleh dari ID Microsoft Entra. Kami akan membahas 4 skenario dalam panduan ini:
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 kode otorisasi OAuth 2.0 memberikan alur untuk masuk ke pengguna dengan pengguna Azure AD B2C Anda.
Pilih Azure AD B2C dari menu portal, pilih aplikasi , lalu pilih Tambahkan.
Tentukan Nama
Pilih Kunci
Pilih alur pengguna di sebelah kiri Anda, lalu pilih Alur pengguna baru.
Pilih Daftar atau di, Pengeditan profil, dan Pengaturan ulang kata sandi untuk membuat alur pengguna masing-masing. Tentukan alur pengguna Anda Nama dan Atribut pengguna dan klaim, lalu pilih Buat.
Pilih izin API
Berikan persetujuan admin untuk izin Grafik
Tambahkan dependensi berikut ke file pom.xml Anda.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
</dependency>
</dependencies>
Tambahkan properti ke file application.yml Anda menggunakan nilai yang Anda buat sebelumnya, seperti yang diperlihatkan dalam contoh berikut:
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
authenticate-additional-parameters:
domain_hint: xxxxxxxxx # optional
login_hint: xxxxxxxxx # optional
prompt: [login,none,consent] # optional
base-uri: ${BASE_URI}
credential:
client-id: ${WEBAPP_AZURE_CLIENT_ID}
client-secret: ${WEBAPP_AZURE_CLIENT_SECRET}
login-flow: ${LOGIN_USER_FLOW_KEY} # default to sign-up-or-sign-in, will look up the user-flows map with provided key.
logout-success-url: ${LOGOUT_SUCCESS_URL}
user-flows:
${YOUR_USER_FLOW_KEY}: ${USER_FLOW_NAME}
user-name-attribute-name: ${USER_NAME_ATTRIBUTE_NAME}
Tulis kode Java Anda.
Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:
@Controller
public class WebController {
private void initializeModel(Model model, OAuth2AuthenticationToken token) {
if (token != null) {
final OAuth2User user = token.getPrincipal();
model.addAllAttributes(user.getAttributes());
model.addAttribute("grant_type", user.getAuthorities());
model.addAttribute("name", user.getName());
}
}
@GetMapping(value = { "/", "/home" })
public String index(Model model, OAuth2AuthenticationToken token) {
initializeModel(model, token);
return "home";
}
}
Untuk kode konfigurasi keamanan, Anda dapat merujuk ke contoh berikut:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
public class WebSecurityConfiguration {
private final AadB2cOidcLoginConfigurer configurer;
public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
this.configurer = configurer;
}
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeHttpRequests()
.anyRequest().authenticated()
.and()
.apply(configurer);
// @formatter:on
return http.build();
}
}
Salin home.html dari sampel aad-b2c-web-application
, dan ganti PROFILE_EDIT_USER_FLOW
dan PASSWORD_RESET_USER_FLOW
dengan nama alur pengguna yang Anda gunakan sebelumnya.
Buat dan uji aplikasi Anda. Biarkan Webapp
berjalan pada port 8080
.
Setelah aplikasi Anda dibangun dan dimulai oleh Maven, buka http://localhost:8080/
di browser web. Anda harus diarahkan ke halaman masuk.
Pilih tautan dengan alur pengguna masuk. Anda harus dialihkan Azure AD B2C untuk memulai proses autentikasi.
Setelah berhasil masuk, Anda akan melihat sampel home page
dari browser.
Penggunaan 2: Aplikasi web yang mengakses server sumber daya
Skenario ini didasarkan pada skenario Mengakses aplikasi web untuk memungkinkan aplikasi mengakses sumber daya lain. Skenario ini alur pemberian kredensial klien OAuth 2.0.
Pilih Azure AD B2C dari menu portal, pilih aplikasi , lalu pilih Tambahkan.
Tentukan Nama
Pilih Kunci
Pilih Mengekspos API dari panel navigasi, lalu pilih Atur. Rekam URI ID Aplikasi
Pilih Manifes dari panel navigasi, lalu tempelkan segmen JSON berikut ke dalam array appRoles
. Rekam URI ID Aplikasi sebagai WEB_API_A_APP_ID_URL
Anda , catat nilai peran aplikasi sebagai WEB_API_A_ROLE_VALUE
Anda, 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 Mengakses aplikasi web skenario.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Tambahkan konfigurasi berikut berdasarkan Mengakses aplikasi web skenario.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: <tenant>
authorization-clients:
${RESOURCE_SERVER_A_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_A_APP_ID_URL}/.default
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Tulis kode Java Webapp
Anda.
Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:
class Demo {
/**
* Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi A.
*/
@GetMapping("/webapp/webApiA")
public String callWebApiA() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiA"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiA(), request '/webApiA/sample' returned: {}", body);
return "Request '/webApiA/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
Kode konfigurasi keamanan sama seperti dalam skenario Mengakses aplikasi web. Tambahkan webClient
kacang lain sebagai berikut:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Untuk menulis kode Java WebApiA
Anda, lihat bagian Mengakses server sumber daya.
Buat dan uji aplikasi Anda. Biarkan Webapp
dan WebApiA
berjalan pada 8080
port dan 8081
masing-masing. Mulai aplikasi Webapp
dan WebApiA
. Kembali ke halaman beranda setelah berhasil masuk. Anda kemudian dapat mengakses http://localhost:8080/webapp/webApiA
untuk mendapatkan respons sumber daya WebApiA
.
Penggunaan 3: Mengakses server sumber daya
Skenario ini tidak mendukung login. Cukup lindungi server dengan memvalidasi token akses, dan jika valid, server melayani permintaan.
Untuk membangun izin WebApiA
Anda, lihat Penggunaan 2: Aplikasi Web Mengakses Server Sumber Daya.
Tambahkan izin WebApiA
dan berikan persetujuan admin untuk aplikasi web Anda.
Tambahkan dependensi berikut ke file pom.xml Anda.
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Tambahkan konfigurasi berikut.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
base-uri: ${BASE_URI} # Such as: https://xxxxb2c.b2clogin.com
profile:
tenant-id: <tenant>
app-id-uri: ${APP_ID_URI} # If you're using v1.0 token, configure app-id-uri for `aud` verification
credential:
client-id: ${AZURE_CLIENT_ID} # If you're using v2.0 token, configure client-id for `aud` verification
user-flows:
sign-up-or-sign-in: ${SIGN_UP_OR_SIGN_IN_USER_FLOW_NAME}
Nota
Nilai yang diizinkan untuk tenant-id
adalah: common
, organizations
, consumers
, atau ID penyewa. Untuk informasi selengkapnya tentang nilai-nilai ini, lihat bagian Menggunakan titik akhir yang salah (akun pribadi dan organisasi)Kesalahan AADSTS50020 - Akun pengguna dari penyedia identitas tidak ada di penyewa. Untuk informasi tentang mengonversi aplikasi penyewa tunggal Anda, lihat Mengonversi aplikasi penyewa tunggal ke multipenyewa di ID Microsoft Entra.
Tulis kode Java Anda.
Untuk kode pengontrol, Anda dapat merujuk ke contoh berikut:
class Demo {
/**
* webApiA resource api for web app
* @return test content
*/
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
@GetMapping("/webApiA/sample")
public String webApiASample() {
LOGGER.info("Call webApiASample()");
return "Request '/webApiA/sample'(WebApi A) returned successfully.";
}
}
Untuk kode konfigurasi keamanan, Anda dapat merujuk ke contoh berikut:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class ResourceServerConfiguration {
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
jwtGrantedAuthoritiesConverter.setAuthorityPrefix("APPROLE_");
authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);
// @formatter:off
http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated())
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(authenticationConverter);
// @formatter:on
return http.build();
}
}
Buat dan uji aplikasi Anda. Biarkan WebApiA
berjalan pada port 8081
. Dapatkan token akses untuk sumber daya webApiA
lalu akses http://localhost:8081/webApiA/sample
sebagai header otorisasi Pembawa.
Penggunaan 4: Server sumber daya yang mengakses server sumber daya lain
Skenario ini adalah peningkatan Mengakses server sumber daya, dan mendukung akses ke sumber daya aplikasi lain, berdasarkan alur kredensial klien OAuth2.
Mengacu pada langkah-langkah sebelumnya, kami membuat aplikasi WebApiB
dan mengekspos izin aplikasi WebApiB.SampleScope
.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
}
Berikan persetujuan admin untuk izin WebApiB
.
Berdasarkan Mengakses server sumber daya, tambahkan dependensi berikut ke file pom.xml Anda.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Tambahkan konfigurasi berikut berdasarkan Mengakses konfigurasi skenario server sumber daya.
spring:
cloud:
azure:
active-directory:
b2c:
enabled: true
credential:
client-secret: ${WEB_API_A_AZURE_CLIENT_SECRET}
authorization-clients:
${RESOURCE_SERVER_B_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_B_APP_ID_URL}/.default
Tulis kode Java Anda.
Untuk kode pengontrol WebApiA
, Anda dapat merujuk ke contoh berikut:
public class SampleController {
/**
* Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or
* <p>@RegisteredOAuth2AuthorizedClient("webApiA")</p>. In the end, these two approaches will be executed to
* DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.
*
* @return Respond to protected data from WebApi B.
*/
@GetMapping("/webApiA/webApiB/sample")
@PreAuthorize("hasAuthority('APPROLE_WebApiA.SampleScope')")
public String callWebApiB() {
String body = webClient
.get()
.uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)
.attributes(clientRegistrationId("webApiB"))
.retrieve()
.bodyToMono(String.class)
.block();
LOGGER.info("Call callWebApiB(), request '/webApiB/sample' returned: {}", body);
return "Request 'webApiA/webApiB/sample'(WebApi A) returned a " + (body != null ? "success." : "failure.");
}
}
Untuk kode pengontrol WebApiB
, Anda dapat merujuk ke contoh berikut:
public class SampleController {
/**
* webApiB resource api for other web application
* @return test content
*/
@PreAuthorize("hasAuthority('APPROLE_WebApiB.SampleScope')")
@GetMapping("/webApiB/sample")
public String webApiBSample() {
LOGGER.info("Call webApiBSample()");
return "Request '/webApiB/sample'(WebApi B) returned successfully.";
}
}
Kode konfigurasi keamanan sama dengan Mengakses server sumber daya skenario, webClient
kacang lain ditambahkan sebagai berikut
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Buat dan uji aplikasi Anda. Biarkan WebApiA
dan WebApiB
berjalan pada 8081
port dan 8082
masing-masing. Mulai aplikasi WebApiA
dan WebApiB
, dapatkan token akses untuk sumber daya webApiA
, dan akses http://localhost:8081/webApiA/webApiB/sample
sebagai header otorisasi Pembawa.
Sampel
Untuk informasi selengkapnya, lihat sampel spring-cloud-azure-starter-active-directory-b2c .