Spring Security için Spring Cloud Azure desteği
Bu makale şunlar için geçerlidir: ✔️ Sürüm 4.14.0 ✔️ Sürüm 5.8.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 Microsoft Entra Id ile kaynak sunucunuzu 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ıyla bir kullanıcıda oturum açmak için OAuth 2.0 yetkilendirme kodu verme akışı kullanılır.
Sistem Diyagramı
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.
Uygulama kaydı oluşturun. ,
AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
alınAZURE_TENANT_ID
.olarak
APPLICATION_BASE_URI/login/oauth2/code/
ayarlayınredirect URI
- örneğinhttp://localhost:8080/login/oauth2/code/
. Kuyruk oluşturma/
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}
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı ç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
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.anyRequest().authenticated();
// Do some custom configuration
}
}
Uygulama rollerine göre erişimi yetkilendirme
Azure'da gerekli kaynakları oluşturma:
Uygulamanıza uygulama rolleri ekleme ve bunları belirteçte alma okuyun.
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
Dekont
Uygulama rolü tabanlı erişim denetimi kullanmak istiyorsanız, talepte role
grup adlarını koyamazsınız. Daha fazla bilgi için, Uygulamanıza isteğe bağlı talepler sağlama'nın İsteğe bağlı talepleri yapılandırma 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 . Ulusal bulut dağıtımları.
Yeniden yönlendirme URI şablonunu yapılandırma
Geliştiriciler redirect-uri'yi özelleştirebilir.
application.yml dosyanıza özellikler ekleyinredirect-uri-template
.
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Azure portalında güncelleştirme redirect-uri
.
ayarladıktan redirect-uri-template
sonra güvenlik oluşturucusunu güncelleştirmemiz gerekir:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.oauth2Login()
.loginProcessingUrl("${REDIRECT-URI-TEMPLATE}")
.and()
.authorizeRequests()
.anyRequest().authenticated();
}
}
Ara sunucu aracılığıyla Microsoft Entra Id'ye Bağlan
Microsoft Entra Id'yi ara sunucu aracılığıyla bağlamak için aşağıdaki örnekte gösterilene benzer bir RestTemplateCustomizer
fasulye 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);
};
}
}
Örnekler
Örnek proje: aad-web-application.
Kaynak sunucularına erişen web uygulaması
Sistem Diyagramı
Azure'da Gerekli Kaynakları Oluşturma
Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.
Uygulama kaydı oluşturun. ,
AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
alınAZURE_TENANT_ID
.olarak ayarlayın
redirect URI
, örneğinhttp://localhost:8080/login/oauth2/code/
.APPLICATION_BASE_URI/login/oauth2/code/
Kuyruk oluşturma/
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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı çok kiracılıya dönüştürme.
graph
Burada adı OAuth2AuthorizedClient
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ış yetkilendirme kodu akışıdır; istemci kimlik bilgileri akışını kullanmak istiyorsanız aşağıdaki gibi yapılandırabilirsiniz:
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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı ç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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı çok kiracılıya dönüştürme.
Daha sonra uygulamada bu şekilde kullanabilirsiniz OAuth2AuthorizedClient
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);
}
}
Örnekler
Ö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ı
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.
Uygulama kaydı oluşturun. alın
AZURE_CLIENT_ID
.Hızlı Başlangıç: Web API'sini kullanıma sunan bir uygulama yapılandırmayı okuyun.
adlı
Scope-1
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 saat öncesindenbf
olamaz.exp
: Geçerli saat sonrasındaexp
olamaz.aud
: Veya yapılandırıldıysaspring.cloud.azure.active-directory.credential.client-id
spring.cloud.azure.active-directory.credential.app-id-uri
, hedef kitlenin yapılandırılanclient-id
veyaapp-id-uri
öğesine 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
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {
/**
* Add configuration logic as needed.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
}
}
Kapsamlara göre izni doğrulama
Azure'da gerekli kaynakları oluşturun.
Hızlı Başlangıç: Web API'sini kullanıma sunan bir uygulama yapılandırmayı okuyun.
adlı
Scope1
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ğeri içermelidirScope1
.
Uygulama rollerine göre izni doğrulama
Azure'da gerekli kaynakları oluşturun.
Uygulamanıza uygulama rolleri ekleme ve bunları belirteçte alma okuyun.
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ğeri içermelidirAppRole1
.
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:
- Uygulama kimlik doğrulama sertifikası kimlik bilgilerini Microsoft kimlik platformu sertifikanızı Microsoft kimlik platformu 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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı çok kiracılıya dönüştürme.
Bu örnekte gösterildiği gibi hizmet özelliklerinde active-directory
sertifika bilgilerini 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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı çok kiracılıya dönüştürme.
Ara sunucu aracılığıyla Microsoft Entra Id'ye Bağlan
Microsoft Entra ID'yi ara sunucu aracılığıyla bağlamak için bir RestTemplateCustomizer
fasulye sağlayın. Daha fazla bilgi için ara sunucu aracılığıyla Microsoft Entra Id'ye Bağlan bölümüne bakın.
Örnekler
Örnek proje: aad-resource-server.
Diğer kaynak sunucularını ziyaret eden kaynak sunucusu
Sistem Diyagramı
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.
Uygulama kaydı oluşturun. ,
AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
alınAZURE_TENANT_ID
.
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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı ç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);
}
}
Örnekler
Örnek proje: aad-resource-server-obo.
Bir uygulamada web uygulaması ve kaynak sunucusu
Azure'da gerekli kaynakları oluşturma
Hızlı Başlangıç: Uygulamayı Microsoft kimlik platformu kaydetmeyi okuyun.
Uygulama kaydı oluşturun. ,
AZURE_CLIENT_ID
veAZURE_CLIENT_SECRET
alınAZURE_TENANT_ID
.
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
özelliğini spring.cloud.azure.active-directory.application-type
olarak web_application_and_resource_server
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
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı ç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.
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadWebApplicationAndResourceServerConfig {
@Order(1)
@Configuration
public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
// All the paths that match `/api/**`(configurable) work as `Resource Server`, other paths work as `Web application`.
http.antMatcher("/api/**")
.authorizeRequests().anyRequest().authenticated();
}
}
@Configuration
public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
// @formatter:off
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated();
// @formatter:on
}
}
}
Yapılandırma
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ğlan ion 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. için tenant-id 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 şudur: {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_", "roles" -> "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 şudur: 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:
Uygulama türü spring-cloud-azure-starter-active-directory
:
Bağımlılığı vardır: spring-security-oauth2-client |
Bağımlılığı vardır: spring-security-oauth2-resource-server |
Uygulama türünün geçerli değerleri | Çıkarsanan değer |
---|---|---|---|
Evet | Hayı | web_application |
web_application |
Hayı | 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üşterilerin uygulamalarınızı kullanırken nasıl kaydolduğunu, oturum açtığını ve profillerini yönettiğini özelleştirip denetlemenizi sağlayan bir kimlik yönetimi sistemidir. Azure AD B2C, aynı anda müşterilerinizin kimliklerini korurken bu eylemleri mümkün kılar.
Bağımlılık kurulumu
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Yapılandırma
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ğlan ion 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 şudur: 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 şudur: 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 şudur: {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 gözden geçirin.
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 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 verme akışı kullanılır.
Portal menüsünden Azure AD B2C'yi seçin, Uygulamalar'ı ve ardından Ekle'yi seçin.
Uygulama Adınızı (örneğinwebapp
), Yanıt URL'si için ekleyinhttp://localhost:8080/login/oauth2/code/
, Uygulama Kimliğini olarak WEB_APP_AZURE_CLIENT_ID
kaydedin ve Kaydet'i seçin.
Uygulamanızdan Anahtarlar'ı seçin, oluşturmak WEB_APP_AZURE_CLIENT_SECRET
için Anahtar oluştur'a ve ardından Kaydet'e tıklayın.
Solunuzda Kullanıcı akışları'yı ve ardından Yeni kullanıcı akışı'yı seçin.
Sırasıyla kullanıcı akışları oluşturmak için Kaydolma veya giriş, Profil düzenleme ve Parola sıfırlama'yı seçin. Kullanıcı akışınızın Adını ve Kullanıcı özniteliklerini ve taleplerini belirtin, ardından Oluştur'u seçin.
API izinleri İzin ekle>Microsoft API'leri'ni> seçin, Microsoft Graph'ı seçin, Temsilci izinleri'ni seçin, offline_access ve openid izinlerini seçin ve ardından işlemi tamamlamak için İzin ekle'yi seçin.
Graph izinleri için yönetici onayı verin.
Aşağıdaki bağımlılıkları pom.xml dosyanıza 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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
</dependencies>
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:
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
private final AadB2cOidcLoginConfigurer configurer;
public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {
this.configurer == configurer;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.apply(configurer);
// @formatter:off
}
}
aad-b2c-web-application örneğinden home.html dosyasını kopyalayın ve ve PASSWORD_RESET_USER_FLOW
değerini daha önce kullandığınız kullanıcı akışı adlarınızla değiştirinPROFILE_EDIT_USER_FLOW
.
Uygulamanızı derleyin ve test edin. 8080 numaralı bağlantı noktasında çalıştıralımWebapp
.
Uygulamanız Maven tarafından derlenip başlatıldıktan sonra bir web tarayıcısında açın http://localhost:8080/
. 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 örneği 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şme senaryosunu temel alır. Bu senaryo, OAuth 2.0 istemci kimlik bilgileri verme akışıdır.
Portal menüsünden Azure AD B2C'yi seçin, Uygulamalar'ı ve ardından Ekle'yi seçin.
Uygulamanızın Adını belirtin (örneğinwebApiA
), Uygulama Kimliğini olarak WEB_API_A_AZURE_CLIENT_ID
kaydedin ve Kaydet'i seçin.
Uygulamanızdan Anahtarlar'ı seçin, oluşturmak WEB_API_A_AZURE_CLIENT_SECRET
için Anahtar oluştur'a ve ardından Kaydet'e tıklayın.
Gezinti bölmesinden BIR API'yi kullanıma sunma'yı ve ardından Ayarla'yı seçin. Uygulama Kimliği URI'sini olarak WEB_API_A_APP_ID_URL
kaydedin ve Kaydet'i seçin.
Gezinti bölmesinde Bildirim'i seçin ve ardından aşağıdaki JSON kesimini diziye appRoles
yapıştırın. Uygulama Kimliği URI'sini sizin WEB_API_A_APP_ID_URL
olarak kaydedin, uygulama rolünün değerini sizin 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 izinleri>İzin ekle>API'lerim'i seçin, WebApiA uygulama adı'nı seçin, Uygulama İzinleri'ni seçin, WebApiA.SampleScope izni'ni seçin ve ardından işlemi tamamlamak için İzin ekle'yi seçin.
WebApiA izinleri için yönetici onayı verin.
Bir web uygulamasına erişme senaryosu temelinde aşağıdaki bağımlılığı ekleyin.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Web uygulamasına erişme senaryosu temelinde 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>
authorization-clients:
${RESOURCE_SERVER_A_NAME}:
authorization-grant-type: client_credentials
scopes: ${WEB_API_A_APP_ID_URL}/.default
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı ç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şme 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();
}
}
Java kodunuzu yazmak WebApiA
için Kaynak sunucusuna erişme bölümüne bakın.
Uygulamanızı derleyin ve test edin. Sırasıyla 8080 ve WebApiA
8081 numaralı bağlantı noktalarını çalıştırınWebapp
. Webapp
ve WebApiA
uygulamalarını başlatın. Başarıyla oturum açtıktan sonra giriş sayfasına dönün. Daha sonra kaynak yanıtını WebApiA
almak için erişebilirsinizhttp://localhost:8080/webapp/webApiA
.
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.
İzninizi WebApiA
oluşturmak için bkz . Kullanım 2: Kaynak Sunucularına Erişen Web Uygulaması.
Web uygulamanız için izin ekleyin WebApiA
ve yönetici onayı verin.
Aşağıdaki bağımlılıkları pom.xml dosyanıza 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}
Dekont
için tenant-id
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ı kullanıcı hesabı kiracıda yok hatası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 . Microsoft Entra Id'de tek kiracılı uygulamayı ç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:
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.anyRequest().authenticated())
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(new AadJwtBearerTokenAuthenticationConverter());
}
}
Uygulamanızı derleyin ve test edin. 8081 numaralı bağlantı noktasında çalıştıralımWebApiA
. Kaynak için erişim belirtecini webApiA
alın ve taşıyıcı yetkilendirme üst bilgisi olarak erişin http://localhost:8081/webApiA/sample
.
Kullanım 4: Diğer kaynak sunucularına erişen kaynak sunucusu
Bu senaryo, OAuth2 istemci kimlik bilgileri akışına bağlı olarak Kaynak sunucusuna erişme yükseltmesi ve diğer uygulama kaynaklarına erişimi destekler.
Önceki adımlara başvurarak bir WebApiB
uygulama oluşturur ve uygulama iznini WebApiB.SampleScope
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"
}
İzinler için WebApiB
yönetici onayı verin.
Kaynak sunucusuna erişme temelinde, pom.xml dosyanıza aşağıdaki bağımlılığı ekleyin.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Kaynak sunucusuna erişme senaryosu 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.
Denetleyici kodunuz WebApiA
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.");
}
}
Denetleyici kodunuz WebApiB
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; aşağıdaki gibi başka bir fasulye webClient
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. Sırasıyla 8081 ve WebApiB
8082 numaralı bağlantı noktalarını çalıştırınWebApiA
. WebApiA
ve WebApiB
uygulamalarını başlatın, kaynak için webApiA
erişim belirtecini alın ve Taşıyıcı yetkilendirme üst bilgisi olarak erişim http://localhost:8081/webApiA/webApiB/sample
sağlayın.
Örnekler
Daha fazla bilgi için bkz . spring-cloud-azure-starter-active-directory-b2c örnekleri.