Spring Security için Spring Cloud Azure desteği
Bu makale şunlar için geçerlidir:✅ Sürüm 4.19.0 ✅ Sürüm 5.19.0
Bu makalede Spring Cloud Azure ve Spring Security'nin birlikte nasıl kullanılabildiği açıklanmaktadır.
Microsoft Entra Id ile Spring Security
Web uygulaması oluştururken kimlik ve erişim yönetimi her zaman temel parçalar olacaktır.
Azure, yalnızca bulut tabanlı kimlik hizmeti değil, azure ekosisteminin geri kalanıyla da derin tümleştirme sunduğundan, uygulama geliştirme yolculuğunuzu demokratikleştirmek için harika bir platform sunar.
Spring Security, güçlü soyutlamalar ve genişletilebilir arabirimlerle Spring tabanlı uygulamalarınızın güvenliğini sağlamayı kolaylaştırdı. Ancak Spring çerçevesi ne kadar güçlü olursa olsun, belirli bir kimlik sağlayıcısına uyarlanmamıştır.
spring-cloud-azure-starter-active-directory
, web uygulamanızı bir Microsoft Entra Id (kısa için Microsoft Entra Id) kiracısına bağlamak ve kaynak sunucunuzu Microsoft Entra Id ile korumak için en uygun yolu sağlar. Web uygulamalarını ve kaynak sunucularını korumak için Oauth 2.0 protokolunu kullanır.
Web uygulamasına erişme
Bu senaryoda, microsoft hesabı olan bir kullanıcıda oturum açmak için OAuth 2.0 yetkilendirme kodu akışı
Sistem Diyagramı
Tek başına web uygulaması için sistem diyagramını
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.
Uygulama kaydı oluşturun.
AZURE_TENANT_ID
alın,AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
.redirect URI
APPLICATION_BASE_URI/login/oauth2/code/
olarak ayarlayın, örneğinhttp://localhost:8080/login/oauth2/code/
. Kuyruk/
gereklidir.
Gerekli bağımlılıkları ekleme
<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>
Gerekli özellikleri ekleme
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Şimdi uygulamanızı başlatın ve tarayıcı üzerinden uygulamanıza erişin. Microsoft oturum açma sayfasına yönlendirilirsiniz.
Gelişmiş kullanımlar
Ek güvenlik yapılandırmaları ekleme
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
@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();
}
}
Uygulama rollerine göre erişimi yetkilendirme
Azure'da gerekli kaynakları oluşturma:
Uygulamanıza uygulama rolleri ekleme okuyun ve bunlarıbelirteçte alın.
Aşağıdaki parametrelerle bir uygulama rolü oluşturun:
- Görünen ad: Yönetici
- İzin verilen üye türleri: Kullanıcılar/Gruplar
- Değer: Yönetici
- Bu uygulama rolünü etkinleştirmek istiyor musunuz: evet
Not
Uygulama rolü tabanlı erişim denetimini kullanmak istiyorsanız, role
talebine grup adları koyamazsınız. Daha fazla bilgi için İsteğe bağlı talepleri yapılandırmauygulamanıza isteğe bağlı talepler sağlama bölümüne bakın.
Belirli bir yöntemi koruyun.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Erişimi grup adına veya grup kimliğine göre yetkilendirme
İlgili yapılandırma özelliklerini ekleyin.
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
Belirli bir yöntemi koruyun.
@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";
}
}
Genel Azure yerine Ulusal Azure kullanma
Genel Azure bulutu dışında, Microsoft Entra ID şu ulusal bulutlara dağıtılır:
Azure Kamu
Azure China 21Vianet
Azure Almanya
Azure China 21Vianet'i kullanan bir örnek aşağıda verilmiştır.
spring:
cloud:
azure:
active-directory:
enabled: true
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn
Daha fazla bilgi için bkz.
Yeniden yönlendirme URI şablonunu yapılandırma
Geliştiriciler redirect-uri'yi özelleştirebilir.
Yeniden yönlendirme URI'leri için sistem diyagramını
redirect-uri-template
dosyanıza özellikleri ekleyin.
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Azure portalında redirect-uri
güncelleştirin.
yeniden yönlendirme URI'sini yapılandırma şablonunu
redirect-uri-template
ayarladıktan sonra güvenlik oluşturucusunu güncelleştirmemiz gerekir:
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
@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();
}
}
Ara sunucu aracılığıyla Microsoft Entra Id'ye bağlanma
Microsoft Entra Id'yi ara sunucu aracılığıyla bağlamak için aşağıdaki örnekte gösterilene benzer bir RestTemplateCustomizer
çekirdeği sağlayın:
@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);
};
}
}
Örnekleri
Örnek proje: aad-web-application
Kaynak sunucularına erişen web uygulaması
Sistem Diyagramı
Kaynak sunucularına erişen bir web uygulaması için sistem diyagramını
Azure'da Gerekli Kaynakları Oluşturma
Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.
Uygulama kaydı oluşturun.
AZURE_TENANT_ID
alın,AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
.redirect URI
APPLICATION_BASE_URI/login/oauth2/code/
olarak ayarlayın, örneğinhttp://localhost:8080/login/oauth2/code/
. Kuyruk/
gereklidir.
Gerekli bağımlılıkları ekleme
<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>
Gerekli özellikleri ekleme
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Burada graph
OAuth2AuthorizedClient
adıdır scopes
oturum açarken onay vermek için gereken kapsamlar anlamına gelir.
Uygulamanızda OAuth2AuthorizedClient kullanma
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);
}
}
Şimdi uygulamanızı başlatın ve tarayıcıdan uygulamanıza erişin. Ardından Microsoft oturum açma sayfasına yönlendirilirsiniz.
Gelişmiş kullanımlar
İstemci Kimlik Bilgisi Akışı
Varsayılan akış,
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Birden çok kaynak sunucusuna erişme
Bir web uygulamasında, aşağıdaki gibi yapılandırarak birden çok kaynak sunucusuna erişebilirsiniz:
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Daha sonra OAuth2AuthorizedClient
bu şekilde kullanabilirsiniz
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);
}
}
Örnekleri
Örnek proje: aad-web-application
Kaynak sunucusuna erişme
Bu senaryo oturum açmayı desteklemez, yalnızca erişim belirtecini doğrulayarak sunucuyu koruyun. Erişim belirteci geçerliyse, sunucu isteğe hizmet eder.
Sistem Diyagramı
Tek başına kaynak sunucusu kullanımı için Sistem diyagramını
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.
Uygulama kaydı oluşturun.
AZURE_CLIENT_ID
alın.Hızlı Başlangıç: Web API'sinikullanıma açmak için bir uygulama yapılandırma okuyun.
Scope-1
adlı bir kapsama sahip bir web API'si kullanıma sunma.
Gerekli bağımlılıkları ekleme
<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>
Gerekli özellikleri ekleme
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
Şimdi uygulamanızı başlatın ve uygulamanızın web api'lerine erişin.
Erişim belirteci olmadan 401 alırsınız.
Uygulamanıza erişim belirteci ile erişin. Erişim belirtecindeki aşağıdaki talepler doğrulanır:
iss
: Erişim belirteci Microsoft Entra Id tarafından verilmelidir.nbf
: Geçerli saatnbf
önce olamaz.exp
: Geçerli saatexp
sonra olamaz.aud
:spring.cloud.azure.active-directory.credential.client-id
veyaspring.cloud.azure.active-directory.credential.app-id-uri
yapılandırılmışsa, hedef kitlenin yapılandırılanclient-id
veyaapp-id-uri
eşit olması gerekir. İki özellik yapılandırılmamışsa, bu talep doğrulanmaz.
Erişim belirteci hakkında daha fazla bilgi için bkz.Microsoft kimlik platformu erişim belirteçleri hakkında MS belgeleri
Gelişmiş kullanımlar
Ek güvenlik yapılandırmaları ekleme
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
@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();
}
}
Kapsamlara göre izni doğrulama
Azure'da gerekli kaynakları oluşturun.
Hızlı Başlangıç: Web API'sinikullanıma açmak için bir uygulama yapılandırma okuyun.
Scope1
adlı bir kapsama sahip bir web API'si kullanıma sunma.
Belirli bir yöntemi koruyun.
class Demo { @GetMapping("scope1") @ResponseBody @PreAuthorize("hasAuthority('SCOPE_Scope1')") public String scope1() { return "Congratulations, you can access `scope1` endpoint."; } }
Bunu yaptığınızda, erişim /scope1
uç noktası olduğunda erişim belirtecindeki aşağıdaki talepler doğrulanır:
-
scp
: DeğerScope1
içermelidir.
Uygulama rollerine göre izni doğrulama
Azure'da gerekli kaynakları oluşturun.
Uygulamanıza uygulama rolleri ekleme okuyun ve bunlarıbelirteçte alın.
Aşağıdaki parametrelerle bir uygulama rolü oluşturun:
- Görünen ad: AppRole1
- İzin verilen üye türleri: Kullanıcılar/Gruplar
- Değer: AppRole1
- Bu uygulama rolünü etkinleştirmek istiyor musunuz: evet
Belirli bir yöntemi koruyun.
class Demo { @GetMapping("app-role1") @ResponseBody @PreAuthorize("hasAuthority('APPROLE_AppRole1')") public String appRole1() { return "Congratulations, you can access `app-role1` endpoint."; } }
Bunu yaptığınızda, erişim /app-role1
uç noktası olduğunda erişim belirtecindeki aşağıdaki talepler doğrulanır:
-
roles
: DeğerAppRole1
içermelidir.
JWT istemci kimlik doğrulamayı kullanma
İstemci kimlik doğrulaması için JSON Web Belirteci (JWT) kullanmak için aşağıdaki adımları kullanın:
Microsoft kimlik platformu uygulama kimlik doğrulama sertifikası kimlik bilgilerinin Sertifikanızı Microsoft kimlik platformuna kaydetme bölümüne bakın.- Azure portalında kayıtlı uygulamaya bir .pem sertifikası yükleyin.
- sertifika yolunu ve parolasını yapılandırın. PFX veya . P12 sertifikası.
- JWT istemci kimlik doğrulaması aracılığıyla kimlik doğrulaması için istemciye özellik
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt
yapılandırmasını ekleyin.
Aşağıdaki örnek yapılandırma dosyası bir web uygulaması senaryosuna yöneliktir. Sertifika bilgileri genel özelliklerde yapılandırılır.
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Sertifika bilgilerini, bu örnekte gösterildiği gibi active-directory
hizmet özelliklerinde de yapılandırabilirsiniz:
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Ara sunucu aracılığıyla Microsoft Entra Id'ye bağlanma
Microsoft Entra Id'yi ara sunucu aracılığıyla bağlamak için bir RestTemplateCustomizer
çekirdeği sağlayın. Daha fazla bilgi için ara sunucu aracılığıyla Microsoft Entra Id'ye bağlanma
Örnekleri
Örnek proje: aad-resource-server
Diğer kaynak sunucularını ziyaret eden kaynak sunucusu
Sistem Diyagramı
Diğer kaynak sunucularını ziyaret eden bir kaynak sunucusu için Sistem diyagramını
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.
Uygulama kaydı oluşturun.
AZURE_TENANT_ID
alın,AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
.
Gerekli bağımlılıkları ekleme
<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>
Gerekli özellikleri ekleme
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Uygulamanızda OAuth2AuthorizedClient kullanma
public class SampleController {
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
return callMicrosoftGraphMeEndpoint(graph);
}
}
Örnekleri
Örnek proje: aad-resource-server-obo
Bir uygulamada web uygulaması ve kaynak sunucusu
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Bir uygulamayıMicrosoft kimlik platformuna kaydetme makalesini okuyun.
Uygulama kaydı oluşturun.
AZURE_TENANT_ID
alın,AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
.
Gerekli bağımlılıkları ekleme
<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>
Gerekli özellikleri ekleme
özellik spring.cloud.azure.active-directory.application-type
web_application_and_resource_server
olarak ayarlayın ve her yetkilendirme istemcisi için yetkilendirme türünü belirtin.
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
SecurityFilterChain Tanımlama
Birden çok SecurityFilterChain
örneği yapılandırın.
AadWebApplicationAndResourceServerConfig
kaynak sunucusu ve web uygulaması için iki güvenlik filtresi zinciri yapılandırması içerir.
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
@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();
}
}
Konfigürasyon
spring-cloud-azure-starter-active-directory'nin yapılandırılabilir özellikleri:
Ad | Açıklama |
---|---|
spring.cloud.azure.active-directory.app-id-uri |
Bir id_token "aud" talebinde kullanılabilecek Uygulama Kimliği URI'si. |
spring.cloud.azure.active-directory.application-type |
Microsoft Entra uygulamasının türü. |
spring.cloud.azure.active-directory.authenticate-additional-parameters |
Yetkilendirme URL'sine ek parametreler ekleyin. |
spring.cloud.azure.active-directory.authorization-clients |
OAuth2 yetkilendirme istemcileri. |
spring.cloud.azure.active-directory.credential.client-id |
Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak istemci kimliği. |
spring.cloud.azure.active-directory.credential.client-secret | Azure ile hizmet sorumlusu kimlik doğrulaması gerçekleştirirken kullanılacak istemci gizli dizisi. |
spring.cloud.azure.active-directory.jwk-set-cache-lifespan | Önbelleğe alınan JWK kümesinin süresi dolmadan önce ayarlanmış olan varsayılan süre 5 dakikadır. |
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time |
Önbelleğe alınan JWK'nin süresi dolmadan önce ayarlanan yenileme süresi varsayılan olarak 5 dakikadır. |
spring.cloud.azure.active-directory.jwt-connect-timeout |
JWKSet Uzak URL çağrısı için Bağlantı Zaman Aşımı. |
spring.cloud.azure.active-directory.jwt-read-timeout |
JWKSet Uzak URL çağrısı için Okuma Zaman Aşımı. |
spring.cloud.azure.active-directory.jwt-size-limit |
JWKSet Uzak URL çağrısının Bayt cinsinden boyut sınırı. |
spring.cloud.azure.active-directory.post-logout-redirect-uri | Oturumu kapatıldıktan sonra yeniden yönlendirme uri'sini seçin. |
spring.cloud.azure.active-directory.profile.cloud-type | Bağlanacak Azure bulutunun adı. Desteklenen türler şunlardır: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER. |
spring.cloud.azure.active-directory.profile.environment |
Microsoft Entra uç noktalarının özellikleri. |
spring.cloud.azure.active-directory.profile.tenant-id |
Azure Kiracı Kimliği.
tenant-id için izin verilen değerler şunlardır: common , organizations , consumers veya kiracı kimliği. |
spring.cloud.azure.active-directory.redirect-uri-template |
Yeniden Yönlendirme Uç Noktası: Yetkilendirme kimlik bilgilerini içeren yanıtları kaynak sahibi kullanıcı aracısı aracılığıyla istemciye döndürmek için yetkilendirme sunucusu tarafından kullanılır. Varsayılan değer {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map |
GrantedAuthority oluşturmak için hangi talebin kullanılacağını ve GrantedAuthority'nin dize değerinin ön ekini yapılandırın. Varsayılan değer: "scp" -> "SCOPE_", "roller" -> "APPROLE_". |
spring.cloud.azure.active-directory.resource-server.principal-claim-name |
AuthenticatedPrincipal#getName içinde erişim belirtecindeki hangi talebin döndürüleceklerini yapılandırın. Varsayılan değer "sub" değeridir. |
spring.cloud.azure.active-directory.session-stateless | True ise durum bilgisi olmayan kimlik doğrulaması filtresi AadAppRoleStatelessAuthenticationFilter'ı etkinleştirir. Varsayılan değer, AadAuthenticationFilter'ı etkinleştiren false değeridir. |
spring.cloud.azure.active-directory.user-group.allowed-group-ids |
Grup kimlikleri, GrantedAuthority oluşturmak için kullanılabilir. |
spring.cloud.azure.active-directory.user-group.allowed-group-names |
Grup adları, GrantedAuthority oluşturmak için kullanılabilir. |
spring.cloud.azure.active-directory.user-group.use-transitive-members |
"True" ise, üyeleri almak için "v1.0/me/transitiveMemberOf" kullanın. Aksi takdirde, "v1.0/me/memberOf" kullanın. Varsayılan değer false . |
spring.cloud.azure.active-directory.user-name-attribute |
Sorumlu adı olarak hangi talebin alınacağına karar verin. |
Bu özelliklerin nasıl kullanılacağına ilişkin bazı örnekler aşağıda verilmiştir:
Uygulama türü
Uygulama türü bağımlılıklardan çıkarılabilir: spring-security-oauth2-client
veya spring-security-oauth2-resource-server
. Çıkarsanan değer istediğiniz değer değilse, uygulama türünü belirtebilirsiniz. Geçerli değerlerin ve çıkarım yapılan değerlerin tablosu aşağıdadır:
spring-cloud-azure-starter-active-directory
uygulama türü:
Bağımlılığı var: spring-security-oauth2-client |
Bağımlılığı var: spring-security-oauth2-resource-server |
Uygulama türünün geçerli değerleri | Çıkarsanan değer |
---|---|---|---|
Evet | Hayır | web_application |
web_application |
Hayır | Evet | resource_server |
resource_server |
Evet | Evet |
web_application , resource_server , resource_server_with_obo , web_application_and_resource_server |
resource_server_with_obo |
Azure Active Directory B2C ile Spring Security
Azure Active Directory (Azure AD) B2C, müşterilerinizin uygulamalarınızı kullanırken nasıl kaydolduğunu, oturum açmasını ve profillerini yönetmesini özelleştirmenize ve denetlemenize olanak tanıyan bir kimlik yönetimi hizmetidir. Azure AD B2C bu eylemleri etkinleştirirken müşterilerinizin kimliklerini de aynı anda korur.
Bağımlılık kurulumu
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Konfigürasyon
spring-cloud-azure-starter-active-directory-b2c'nin yapılandırılabilir özellikleri:
Ad | Açıklama |
---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri | Bir belirtecin "aud" talebinde kullanılabilecek Uygulama Kimliği URI'si. |
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters | Kimlik doğrulaması için ek parametreler. |
spring.cloud.azure.active-directory.b2c.authorization-clients | İstemci yapılandırmasını belirtin. |
spring.cloud.azure.active-directory.b2c.base-uri | Azure AD B2C uç nokta temel uri'si. |
spring.cloud.azure.active-directory.b2c.credential | Azure AD B2C kimlik bilgileri. |
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout | JWKSet Uzak URL çağrısı için Bağlantı Zaman Aşımı. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout | JWKSet Uzak URL çağrısı için Okuma Zaman Aşımı. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit | JWKSet Uzak URL çağrısının Bayt cinsinden boyut sınırı. |
spring.cloud.azure.active-directory.b2c.login-flow | Birincil oturum açma akış anahtarını belirtin. Varsayılan değer sign-up-or-sign-in . |
spring.cloud.azure.active-directory.b2c.logout-success-url | Oturumu kapatıldıktan sonra URL'yi yeniden yönlendirin. Varsayılan değer http://localhost:8080/login . |
spring.cloud.azure.active-directory.b2c.profile | Azure AD B2C profil bilgileri. |
spring.cloud.azure.active-directory.b2c.reply-url | Yetkilendirme kodunu aldıktan sonra yanıt URL'si. Varsayılan değer {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.b2c.user-flows |
Kullanıcı akışları. |
spring.cloud.azure.active-directory.b2c.user-name-attribute-name | Kullanıcı adı öznitelik adı. |
Tam yapılandırmalar için spring cloud azure yapılandırma özelliklerini
Temel kullanım
web uygulaması, kullanıcının Microsoft Entra Id ile oturum açmasına olanak tanıyan herhangi bir web tabanlı uygulamadır, ancak bir kaynak sunucusu Microsoft Entra Id'den alınan access_token doğruladıktan sonra erişimi kabul eder veya reddeder. Bu kılavuzda 4 senaryo ele alınacağız:
Bir web uygulamasına erişme.
Kaynak sunucularına erişen web uygulaması.
Kaynak sunucusuna erişme.
Diğer kaynak sunucularına erişen kaynak sunucusu.
Kullanım 1: Web uygulamasına erişme
Bu senaryoda, Azure AD B2C kullanıcınızla bir kullanıcıda oturum açmak için OAuth 2.0 yetkilendirme kodu akışı
Portal menüsünden Azure AD B2C
Uygulamanızı
Uygulamanızdan
Solunuzda
Graph izinleri için yönetici onayı verin.
pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin.
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
<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>
Aşağıdaki örnekte gösterildiği gibi, daha önce oluşturduğunuz değerleri kullanarak application.yml dosyanıza özellikler ekleyin:
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}
Java kodunuzu yazın.
Denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:
@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";
}
}
Güvenlik yapılandırma kodunuz için aşağıdaki örne başvurabilirsiniz:
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
@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();
}
}
aad-b2c-web-application
örnekhome.html kopyalayın ve PROFILE_EDIT_USER_FLOW
ve PASSWORD_RESET_USER_FLOW
daha önce kullandığınız kullanıcı akışı adlarınızla değiştirin.
Uygulamanızı derleyin ve test edin.
Webapp
8080
bağlantı noktasında çalışmasına izin verin.
Uygulamanız Maven tarafından derlenip başlatıldıktan sonra http://localhost:8080/
bir web tarayıcısında açın. Oturum açma sayfasına yönlendirilmelisiniz.
Oturum açma kullanıcı akışını içeren bağlantıyı seçin. Kimlik doğrulama işlemini başlatmak için Azure AD B2C'ye yönlendirilmelisiniz.
Başarıyla oturum açtıktan sonra tarayıcıdan örnek home page
görmeniz gerekir.
Kullanım 2: Kaynak sunucularına erişen web uygulaması
Bu senaryo, bir uygulamanın diğer kaynaklara erişmesine izin vermek için web uygulamasına erişim
Portal menüsünden Azure AD B2C
Uygulamanızın Ad (
Uygulamanızdan
Gezinti bölmesinden API kullanıma sunma'yı seçin ve ardından Ayarla'yı seçin.
kaydedin ve WEB_API_A_APP_ID_URL
'ı seçin.
Gezinti bölmesinde bildirim WEB_API_A_APP_ID_URL
olarak kaydedin, uygulama rolünün değerini WEB_API_A_ROLE_VALUE
olarak kaydedin ve Kaydet'i seçin.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
}
API izinlerini
WebApiA izinleri için yönetici onayı verin.
Uygulama API'si izinleri ekranını gösteren Azure portalı ekran görüntüsü
Web uygulamasına erişim senaryosuna
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Bir web uygulamasına erişim senaryosuna
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
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Webapp
Java kodunuzu yazın.
Denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:
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.");
}
}
Güvenlik yapılandırma kodu, Web uygulamasına erişim senaryosundakiyle aynıdır. Aşağıdaki gibi başka bir fasulye webClient
ekleyin:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
WebApiA
Java kodunuzu yazmak için Kaynak sunucusuna erişme bölümüne bakın.
Uygulamanızı derleyin ve test edin.
Webapp
ve WebApiA
sırasıyla bağlantı noktası 8080
ve 8081
üzerinde çalışmasına izin verin.
Webapp
ve WebApiA
uygulamalarını başlatın. Başarıyla oturum açtıktan sonra giriş sayfasına dönün. Daha sonra http://localhost:8080/webapp/webApiA
kaynak yanıtını almak için WebApiA
erişebilirsiniz.
Kullanım 3: Kaynak sunucusuna erişme
Bu senaryo oturum açmayı desteklemez. Yalnızca erişim belirtecini doğrulayarak sunucuyu koruyun ve geçerliyse isteğe hizmet eder.
WebApiA
izninizi oluşturmak için bkz. Kullanım 2: Kaynak Sunucularına Erişen Web Uygulaması.
WebApiA
izni ekleyin ve web uygulamanız için yönetici onayı verin.
pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin.
<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>
Aşağıdaki yapılandırmayı ekleyin.
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}
Not
tenant-id
için izin verilen değerler şunlardır: common
, organizations
, consumers
veya kiracı kimliği. Bu değerler hakkında daha fazla bilgi için, Hata AADSTS50020 - Kimlik sağlayıcısından kullanıcı hesabı kiracımevcut değil bölümünün Yanlış uç nokta (kişisel ve kuruluş hesapları) kullanıldı bölümüne bakın. Tek kiracılı uygulamanızı dönüştürme hakkında bilgi için bkz. Tek kiracılı uygulamayı Microsoft Entra IDüzerinde çok kiracılıya dönüştürme.
Java kodunuzu yazın.
Denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:
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.";
}
}
Güvenlik yapılandırma kodunuz için aşağıdaki örne başvurabilirsiniz:
-
Spring Cloud Azure 5.x
-
Spring Cloud Azure 4.x
@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();
}
}
Uygulamanızı derleyin ve test edin.
WebApiA
8081
bağlantı noktasında çalışmasına izin verin.
webApiA
kaynağı için erişim belirtecini alın ve taşıyıcı yetkilendirme üst bilgisi olarak http://localhost:8081/webApiA/sample
erişin.
Kullanım 4: Diğer kaynak sunucularına erişen kaynak sunucusu
Bu senaryo, bir kaynak sunucusuna erişme yükseltmesi ve OAuth2 istemci kimlik bilgileri akışı temelinde diğer uygulama kaynaklarına erişimi destekler.
Önceki adımlara başvurarak bir WebApiB
uygulaması oluşturur ve WebApiB.SampleScope
uygulama iznini kullanıma sunarız.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiB.SampleScope",
"displayName": "WebApiB.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "WebApiB.SampleScope"
}
WebApiB
izinleri için yönetici onayı verin.
Uygulama WebApiA API'si izinleri ekranını gösteren Azure portalı ekran görüntüsü
bir kaynak sunucusuna erişme
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Kaynak sunucusuna erişme senaryo yapılandırması temelinde aşağıdaki yapılandırmayı ekleyin.
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
Java kodunuzu yazın.
WebApiA
denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:
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
denetleyici kodunuz için aşağıdaki örne başvurabilirsiniz:
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.";
}
}
Güvenlik yapılandırma kodu, Kaynak sunucusuna erişme senaryosunda aynıdır; başka bir fasulye webClient
aşağıdaki gibi eklenir
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Uygulamanızı derleyin ve test edin.
WebApiA
ve WebApiB
sırasıyla bağlantı noktası 8081
ve 8082
üzerinde çalışmasına izin verin.
WebApiA
ve WebApiB
uygulamalarını başlatın, webApiA
kaynağın erişim belirtecini alın ve Taşıyıcı yetkilendirme üst bilgisi olarak http://localhost:8081/webApiA/webApiB/sample
erişin.
Örnekleri
Daha fazla bilgi için