Spring Cloud Azure-ondersteuning voor Spring Security
Dit artikel is van toepassing op:✅ versie 4.19.0 ✅ versie 5.19.0
In dit artikel wordt beschreven hoe Spring Cloud Azure en Spring Security samen kunnen worden gebruikt.
Spring Security met Microsoft Entra-id
Wanneer u een webtoepassing bouwt, zijn identiteits- en toegangsbeheer altijd fundamentele onderdelen.
Azure biedt een geweldig platform om uw toepassingsontwikkelingstraject te democratiseren, omdat het niet alleen een cloudidentiteitsservice biedt, maar ook een diepgaande integratie met de rest van het Azure-ecosysteem.
Spring Security heeft het eenvoudig gemaakt om uw Spring-toepassingen te beveiligen met krachtige abstracties en uitbreidbare interfaces. Maar net zo krachtig als het Spring-framework kan zijn, is het niet afgestemd op een specifieke id-provider.
De spring-cloud-azure-starter-active-directory
biedt de meest optimale manier om uw webtoepassing te verbinden met een Microsoft Entra ID -tenant (Microsoft Entra ID voor korte tijd) en uw resourceserver te beveiligen met Microsoft Entra ID. Het maakt gebruik van het Oauth 2.0-protocol om webtoepassingen en bronservers te beveiligen.
Toegang tot een webtoepassing
In dit scenario wordt de OAuth 2.0-autorisatiecode stroom verlenen om u aan te melden bij een gebruiker met een Microsoft-account.
Systeemdiagram
Vereiste resources maken in Azure
Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.
Maak een app-registratie. Haal
AZURE_TENANT_ID
,AZURE_CLIENT_ID
enAZURE_CLIENT_SECRET
op.Stel
redirect URI
in opAPPLICATION_BASE_URI/login/oauth2/code/
, bijvoorbeeldhttp://localhost:8080/login/oauth2/code/
. De tailing/
is vereist.
Vereiste afhankelijkheden toevoegen
<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>
Vereiste eigenschappen toevoegen
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Start nu uw toepassing en open uw toepassing via de browser. U wordt omgeleid naar de aanmeldingspagina van Microsoft.
Geavanceerd gebruik
Extra beveiligingsconfiguraties toevoegen
@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();
}
}
Toegang autoriseren door app-rollen
Vereiste resources maken in Azure:
Lees App-rollen toevoegen aan uw toepassing en ontvang deze in het token.
Maak een app-rol met de volgende parameters:
- Weergavenaam: Beheerder
- Toegestane lidtypen: Gebruikers/groepen
- Waarde: Beheerder
- Wilt u deze app-rol inschakelen: ja
Notitie
Als u op rollen gebaseerd toegangsbeheer voor apps wilt gebruiken, kunt u geen groepsnamen in de role
claim plaatsen. Zie de sectie Optionele claims configureren sectie van Optionele claims opgeven voor uw app-voor meer informatie.
Beveilig de specifieke methode.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Toegang autoriseren op groepsnaam of groeps-id
Gerelateerde configuratie-eigenschappen toevoegen.
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
Beveilig de specifieke methode.
@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";
}
}
National Azure gebruiken in plaats van Global Azure
Met uitzondering van de globale Azure-cloud wordt Microsoft Entra ID geïmplementeerd in de volgende nationale clouds:
Azure Government
Azure China 21Vianet
Azure Duitsland
Hier volgt een voorbeeld met behulp van Azure China 21Vianet.
spring:
cloud:
azure:
active-directory:
enabled: true
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn
Zie Nationale cloudimplementatiesvoor meer informatie.
Omleidings-URI-sjabloon configureren
Ontwikkelaars kunnen de omleidings-URI aanpassen.
Voeg redirect-uri-template
eigenschappen toe aan uw application.yml-bestand.
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Werk redirect-uri
bij in Azure Portal.
Nadat we redirect-uri-template
hebben ingesteld, moeten we de opbouwfunctie voor beveiliging bijwerken:
@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();
}
}
Verbinding maken met Microsoft Entra-id via proxy
Als u Microsoft Entra-id via een proxy wilt verbinden, geeft u een RestTemplateCustomizer
bean op zoals in het volgende voorbeeld:
@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);
};
}
}
Monsters
Voorbeeldproject: aad-webtoepassing.
Webtoepassing die toegang heeft tot resourceservers
Systeemdiagram
Vereiste resources maken in Azure
Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.
Maak een app-registratie. Haal
AZURE_TENANT_ID
,AZURE_CLIENT_ID
enAZURE_CLIENT_SECRET
op.Stel
redirect URI
in opAPPLICATION_BASE_URI/login/oauth2/code/
, bijvoorbeeldhttp://localhost:8080/login/oauth2/code/
. De tailing/
is vereist.
Vereiste afhankelijkheden toevoegen
<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>
Vereiste eigenschappen toevoegen
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Hier is graph
de naam van OAuth2AuthorizedClient
, scopes
betekent dit de bereiken die nodig zijn om toestemming te geven bij het aanmelden.
OAuth2AuthorizedClient gebruiken in uw toepassing
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);
}
}
Start nu uw toepassing en open uw toepassing in de browser. Vervolgens wordt u omgeleid naar de aanmeldingspagina van Microsoft.
Geavanceerd gebruik
Clientreferentiestroom
De standaardstroom is autorisatiecodestroom, als u clientreferentiestroom wilt gebruiken, kunt u als volgt configureren:
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Toegang tot meerdere resourceservers
In één webtoepassing hebt u toegang tot meerdere resourceservers door als volgt te configureren:
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Vervolgens kunt u OAuth2AuthorizedClient
gebruiken in een toepassing zoals deze
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);
}
}
Monsters
Voorbeeldproject: aad-webtoepassing.
Toegang tot een resourceserver
Dit scenario biedt geen ondersteuning voor aanmelding. Beveilig de server alleen door het toegangstoken te valideren. Als het toegangstoken geldig is, dient de server de aanvraag.
Systeemdiagram
Vereiste resources maken in Azure
Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.
Maak een app-registratie. Haal
AZURE_CLIENT_ID
.Lees quickstart: Een toepassing configureren om een web-API beschikbaar te maken.
Een web-API beschikbaar maken met een bereik met de naam
Scope-1
.
Vereiste afhankelijkheden toevoegen
<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>
Vereiste eigenschappen toevoegen
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
Start nu uw toepassing en open de web-API van uw toepassing.
U krijgt 401 zonder toegangstoken.
Toegang tot uw toepassing met een toegangstoken. De volgende claims in het toegangstoken worden gevalideerd:
iss
: het toegangstoken moet worden uitgegeven door Microsoft Entra ID.nbf
: de huidige tijd kan niet vóórnbf
zijn.exp
: de huidige tijd kan niet naexp
.aud
: alsspring.cloud.azure.active-directory.credential.client-id
ofspring.cloud.azure.active-directory.credential.app-id-uri
geconfigureerd, moet de doelgroep gelijk zijn aan de geconfigureerdeclient-id
ofapp-id-uri
. Als de twee eigenschappen niet zijn geconfigureerd, wordt deze claim niet gevalideerd.
Zie MS-documenten over toegangstokens van Microsoft Identity Platformvoor meer informatie over het toegangstoken.
Geavanceerd gebruik
Extra beveiligingsconfiguraties toevoegen
@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();
}
}
Machtiging valideren op bereik
Maak vereiste resources in Azure.
Lees quickstart: Een toepassing configureren om een web-API beschikbaar te maken.
Een web-API beschikbaar maken met een bereik met de naam
Scope1
.
Beveilig de specifieke methode.
class Demo { @GetMapping("scope1") @ResponseBody @PreAuthorize("hasAuthority('SCOPE_Scope1')") public String scope1() { return "Congratulations, you can access `scope1` endpoint."; } }
Als u dit doet, worden de volgende claims in het toegangstoken gevalideerd wanneer toegang /scope1
eindpunt:
-
scp
: de waarde moetScope1
bevatten.
Machtiging valideren per app-rollen
Maak vereiste resources in Azure.
Lees App-rollen toevoegen aan uw toepassing en ontvang deze in het token.
Maak een app-rol met de volgende parameters:
- Weergavenaam: AppRole1
- Toegestane lidtypen: Gebruikers/groepen
- Waarde: AppRole1
- Wilt u deze app-rol inschakelen: ja
Beveilig de specifieke methode.
class Demo { @GetMapping("app-role1") @ResponseBody @PreAuthorize("hasAuthority('APPROLE_AppRole1')") public String appRole1() { return "Congratulations, you can access `app-role1` endpoint."; } }
Als u dit doet, worden de volgende claims in het toegangstoken gevalideerd wanneer toegang /app-role1
eindpunt:
-
roles
: de waarde moetAppRole1
bevatten.
JWT-clientverificatie gebruiken
Als u een JSON-webtoken (JWT) wilt gebruiken voor clientverificatie, gebruikt u de volgende stappen:
- Zie het gedeelte Uw certificaat registreren bij Microsoft Identity Platform sectie van verificatiecertificaatreferenties voor microsoft-identiteitsplatformtoepassingen.
- Upload een PEM--certificaat naar de toepassing die is geregistreerd in Azure Portal.
- Configureer het certificaatpad en wachtwoord van een . PFX- of . P12 certificaat.
- Voeg de eigenschap
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt
configuratie toe aan de client die moet worden geverifieerd via JWT-clientverificatie.
Het volgende voorbeeldconfiguratiebestand is bedoeld voor een webtoepassingsscenario. De certificaatgegevens worden geconfigureerd in de globale eigenschappen.
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
U kunt de certificaatgegevens ook configureren in de eigenschappen van de active-directory
-service, zoals wordt weergegeven in dit voorbeeld:
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Verbinding maken met Microsoft Entra-id via proxy
Als u Microsoft Entra-id via proxy wilt verbinden, geeft u een RestTemplateCustomizer
bean op. Zie de sectie Verbinding maken met Microsoft Entra-id via proxy voor meer informatie.
Monsters
Voorbeeldproject: aad-resource-server.
Resourceserver die andere resourceservers bezoekt
Systeemdiagram
Vereiste resources maken in Azure
Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.
Maak een app-registratie. Haal
AZURE_TENANT_ID
,AZURE_CLIENT_ID
enAZURE_CLIENT_SECRET
op.
Vereiste afhankelijkheden toevoegen
<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>
Vereiste eigenschappen toevoegen
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
OAuth2AuthorizedClient gebruiken in uw toepassing
public class SampleController {
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
return callMicrosoftGraphMeEndpoint(graph);
}
}
Monsters
Voorbeeldproject: aad-resource-server-obo.
Webtoepassing en resourceserver in één toepassing
Vereiste resources maken in Azure
Lees quickstart: Een toepassing registreren bij het Microsoft Identity Platform.
Maak een app-registratie. Haal
AZURE_TENANT_ID
,AZURE_CLIENT_ID
enAZURE_CLIENT_SECRET
op.
Vereiste afhankelijkheden toevoegen
<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>
Vereiste eigenschappen toevoegen
Stel de eigenschap spring.cloud.azure.active-directory.application-type
in op web_application_and_resource_server
en geef het autorisatietype voor elke autorisatieclient op.
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
SecurityFilterChain definiëren
Meerdere SecurityFilterChain
-exemplaren configureren.
AadWebApplicationAndResourceServerConfig
bevat twee configuraties voor beveiligingsfilterketens voor resourceserver en webtoepassing.
@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();
}
}
Configuratie
Configureerbare eigenschappen van spring-cloud-azure-starter-active-directory:
Naam | Beschrijving |
---|---|
spring.cloud.azure.active-directory.app-id-uri | App-id-URI die kan worden gebruikt in de claim 'aud' van een id_token. |
spring.cloud.azure.active-directory.application-type | Type van de Microsoft Entra-toepassing. |
spring.cloud.azure.active-directory.authenticate-additional-parameters | Voeg extra parameters toe aan de autorisatie-URL. |
spring.cloud.azure.active-directory.authorization-clients | De OAuth2-autorisatieclients. |
spring.cloud.azure.active-directory.credential.client-id | Client-id die moet worden gebruikt bij het uitvoeren van service-principalverificatie met Azure. |
spring.cloud.azure.active-directory.credential.client-secret | Clientgeheim dat moet worden gebruikt bij het uitvoeren van service-principal-verificatie met Azure. |
spring.cloud.azure.active-directory.jwk-set-cache-levensduur | De levensduur van de in de cache opgeslagen JWK die is ingesteld voordat deze verloopt, is standaard 5 minuten. |
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time | De vernieuwingstijd van de in de cache opgeslagen JWK die is ingesteld voordat deze verloopt, is standaard 5 minuten. |
spring.cloud.azure.active-directory.jwt-connect-timeout | Verbindingstime-out voor de externe URL-aanroep van JWKSet. |
spring.cloud.azure.active-directory.jwt-read-timeout | Time-out lezen voor de externe JWKSet-URL-aanroep. |
spring.cloud.azure.active-directory.jwt-size-limit | Groottelimiet in bytes van de externe JWKSet-URL-aanroep. |
spring.cloud.azure.active-directory.post-logout-redirect-uri | De omleidings-URI na afmelding. |
spring.cloud.azure.active-directory.profile.cloud-type | Naam van de Azure-cloud waarmee verbinding moet worden gemaakt. Ondersteunde typen zijn: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER. |
spring.cloud.azure.active-directory.profile.environment | Eigenschappen voor Microsoft Entra-eindpunten. |
spring.cloud.azure.active-directory.profile.tenant-id | Azure-tenant-id. De waarden die zijn toegestaan voor tenant-id zijn: common , organizations , consumers of de tenant-id. |
spring.cloud.azure.active-directory.redirect-uri-template | Omleidingseindpunt: wordt gebruikt door de autorisatieserver om antwoorden met autorisatiereferenties naar de client te retourneren via de gebruikersagent van de resource-eigenaar. De standaardwaarde is {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map | Configureer welke claim wordt gebruikt voor het bouwen van GrantedAuthority en het voorvoegsel van de tekenreekswaarde van GrantedAuthority. De standaardwaarde is: 'scp' -> 'SCOPE_', 'rollen' -> 'APPROLE_'. |
spring.cloud.azure.active-directory.resource-server.principal-claim-name | Configureer welke claim in toegangstoken moet worden geretourneerd in AuthenticatedPrincipal#getName. De standaardwaarde is 'sub'. |
spring.cloud.azure.active-directory.session-stateless | Als waar is, wordt het staatloze verificatiefilter AadAppRoleStatelessAuthenticationFilter geactiveerd. De standaardwaarde is onwaar waarmee AadAuthenticationFilter wordt geactiveerd. |
spring.cloud.azure.active-directory.user-group.allowed-group-ids | De groeps-id's kunnen worden gebruikt om GrantedAuthority samen te stellen. |
spring.cloud.azure.active-directory.user-group.allowed-group-names | De groepsnamen kunnen worden gebruikt om GrantedAuthority samen te stellen. |
spring.cloud.azure.active-directory.user-group.use-transitive-members | Als 'true', gebruikt u 'v1.0/me/transitiveMemberOf' om leden op te halen. Gebruik anders 'v1.0/me/memberOf'. De standaardwaarde is false . |
spring.cloud.azure.active-directory.user-name-attribute | Bepaal welke claim de naam van de principal moet zijn. |
Hier volgen enkele voorbeelden van het gebruik van deze eigenschappen:
Toepassingstype
Het toepassingstype kan worden afgeleid van de afhankelijkheden: spring-security-oauth2-client
of spring-security-oauth2-resource-server
. Als de uitgestelde waarde niet de gewenste waarde is, kunt u het toepassingstype opgeven. Hier volgt de tabel met geldige waarden en uitgestelde waarden:
Toepassingstype van spring-cloud-azure-starter-active-directory
:
Heeft afhankelijkheid: spring-security-oauth2-client |
Heeft afhankelijkheid: spring-security-oauth2-resource-server |
Geldige waarden van het toepassingstype | Uitgestelde waarde |
---|---|---|---|
Ja | Nee | web_application |
web_application |
Nee | Ja | resource_server |
resource_server |
Ja | Ja |
web_application , resource_server , resource_server_with_obo , web_application_and_resource_server |
resource_server_with_obo |
Spring Security met Azure Active Directory B2C
Azure Active Directory (Azure AD) B2C is een service voor identiteitsbeheer waarmee u kunt aanpassen en bepalen hoe klanten zich registreren, aanmelden en hun profielen beheren wanneer ze uw toepassingen gebruiken. Azure AD B2C maakt deze acties mogelijk en beschermt tegelijkertijd de identiteiten van uw klanten.
Afhankelijkheid instellen
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Configuratie
Configureerbare eigenschappen van spring-cloud-azure-starter-active-directory-b2c:
Naam | Beschrijving |
---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri | App-id-URI die kan worden gebruikt in de claim aud van een token. |
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters | Aanvullende parameters voor verificatie. |
spring.cloud.azure.active-directory.b2c.authorization-clients | Geef de clientconfiguratie op. |
spring.cloud.azure.active-directory.b2c.base-uri | Basis-URI van Azure AD B2C-eindpunt. |
spring.cloud.azure.active-directory.b2c.credential | Azure AD B2C-referentiegegevens. |
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout | Verbindingstime-out voor de externe URL-aanroep van JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout | Time-out lezen voor de externe JWKSet-URL-aanroep. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit | Groottelimiet in bytes van de externe JWKSet-URL-aanroep. |
spring.cloud.azure.active-directory.b2c.login-flow | Geef de primaire aanmeldingsstroomsleutel op. De standaardwaarde is sign-up-or-sign-in . |
spring.cloud.azure.active-directory.b2c.logout-success-url | Omleidings-URL na afmelding. De standaardwaarde is http://localhost:8080/login . |
spring.cloud.azure.active-directory.b2c.profile | Azure AD B2C-profielgegevens. |
spring.cloud.azure.active-directory.b2c.reply-url | Antwoord-URL na het ophalen van autorisatiecode. De standaardwaarde is {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.b2c.user-flows | Gebruikersstromen. |
spring.cloud.azure.active-directory.b2c.user-name-attribute-name | Kenmerknaam van gebruikersnaam. |
Controleer Eigenschappen van Spring Cloud Azure-configuratievoor volledige configuraties.
Basisgebruik
Een -webtoepassing is een webtoepassing waarmee de gebruiker zich kan aanmelden met Microsoft Entra ID, terwijl een resourceserver toegang accepteert of weigert nadat access_token is verkregen bij Microsoft Entra ID. In deze handleiding worden vier scenario's behandeld:
Toegang tot een webtoepassing.
Webtoepassing die toegang heeft tot resourceservers.
Toegang tot een resourceserver.
Resourceserver die toegang heeft tot andere resourceservers.
Gebruik 1: Toegang tot een webtoepassing
In dit scenario wordt de OAuth 2.0-autorisatiecode stroom verlenen om u aan te melden bij een gebruiker met uw Azure AD B2C-gebruiker.
Selecteer Azure AD B2C- in het portalmenu, selecteer Toepassingenen selecteer vervolgens toevoegen.
Geef uw toepassing naam op (zoals webapp
), voeg http://localhost:8080/login/oauth2/code/
toe voor de antwoord-URL, noteer de toepassings-id als uw WEB_APP_AZURE_CLIENT_ID
en selecteer vervolgens Opslaan.
Selecteer Sleutels in uw toepassing, selecteer Sleutel genereren om WEB_APP_AZURE_CLIENT_SECRET
te genereren en selecteer vervolgens Opslaan.
Selecteer Gebruikersstromen aan de linkerkant en selecteer vervolgens Nieuwe gebruikersstroom.
Kies Registreren of in, Profiel bewerkenen wachtwoord opnieuw instellen om respectievelijk gebruikersstromen te maken. Geef de gebruikersstroom op naam en gebruikerskenmerken en claimsen selecteer vervolgens maken.
Selecteer API-machtigingen>Een machtiging toevoegen>Microsoft-API's, selecteer Microsoft Graph, selecteer Gedelegeerde machtigingen, selecteer de offline_access en openid machtigingen en selecteer vervolgens Machtiging toevoegen om het proces te voltooien.
Beheerderstoestemming verlenen voor Graph-machtigingen.
Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand.
<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>
Voeg eigenschappen toe aan uw application.yml-bestand met behulp van de waarden die u eerder hebt gemaakt, zoals wordt weergegeven in het volgende voorbeeld:
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}
Schrijf uw Java-code.
Voor de controllercode kunt u het volgende voorbeeld raadplegen:
@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";
}
}
Raadpleeg het volgende voorbeeld voor uw beveiligingsconfiguratiecode:
@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();
}
}
Kopieer de home.html uit voorbeeld van een aad-b2c-webtoepassingen vervang de PROFILE_EDIT_USER_FLOW
en PASSWORD_RESET_USER_FLOW
door de namen van uw gebruikersstroom die u eerder hebt gebruikt.
Bouw en test uw app. Laat Webapp
uitvoeren op poort 8080.
Nadat uw toepassing is gemaakt en gestart door Maven, opent u http://localhost:8080/
in een webbrowser. U wordt omgeleid naar de aanmeldingspagina.
Selecteer de koppeling met de aanmeldingsgebruikersstroom. U moet Azure AD B2C omleiden om het verificatieproces te starten.
Nadat u bent aangemeld, ziet u het voorbeeld home page
in de browser.
Gebruik 2: Webtoepassing die toegang heeft tot resourceservers
Dit scenario is gebaseerd op de Toegang tot een webtoepassing scenario om een toepassing toegang te geven tot andere resources. Dit scenario is de OAuth 2.0-clientreferenties stroom verlenen.
Selecteer Azure AD B2C- in het portalmenu, selecteer Toepassingenen selecteer vervolgens toevoegen.
Geef uw toepassing naam op (zoals webApiA
), noteer de toepassings-id als uw WEB_API_A_AZURE_CLIENT_ID
en selecteer vervolgens Opslaan.
Selecteer Sleutels in uw toepassing, selecteer Sleutel genereren om WEB_API_A_AZURE_CLIENT_SECRET
te genereren en selecteer vervolgens Opslaan.
Selecteer Een API- beschikbaar maken in het navigatiedeelvenster en selecteer vervolgens instellen. Noteer de URI van de toepassings-id als uw WEB_API_A_APP_ID_URL
en selecteer vervolgens Opslaan.
Selecteer Manifest in het navigatiedeelvenster en plak het volgende JSON-segment in appRoles
matrix. Noteer de URI van de toepassings-id als uw WEB_API_A_APP_ID_URL
, noteer de waarde van de app-rol als uw WEB_API_A_ROLE_VALUE
en selecteer vervolgens Opslaan.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
}
Selecteer API-machtigingen>Een machtiging toevoegen>Mijn API's, selecteer WebApiA toepassingsnaam, selecteer Toepassingsmachtigingen, selecteer WebApiA.SampleScope machtiging en selecteer vervolgens Machtiging toevoegen om het proces te voltooien.
Beheerderstoestemming verlenen voor WebApiA- machtigingen.
Voeg de volgende afhankelijkheid toe op basis van de Accessing a web application scenario.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Voeg de volgende configuratie toe op basis van de Accessing a web application scenario.
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
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Schrijf uw Webapp
Java-code.
Voor de controllercode kunt u het volgende voorbeeld raadplegen:
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.");
}
}
Beveiligingsconfiguratiecode is hetzelfde als in de Toegang tot een webtoepassing scenario. Voeg als volgt een andere webClient
toe:
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Als u uw WebApiA
Java-code wilt schrijven, raadpleegt u de sectie Toegang tot een resourceserver.
Bouw en test uw app. Laat Webapp
en WebApiA
op respectievelijk poort 8080 en 8081 worden uitgevoerd. Start de Webapp
- en WebApiA
-toepassingen. Ga terug naar de startpagina nadat u zich hebt aangemeld. Vervolgens hebt u toegang tot http://localhost:8080/webapp/webApiA
om het antwoord van de WebApiA
resource op te halen.
Gebruik 3: Toegang tot een resourceserver
Dit scenario biedt geen ondersteuning voor aanmelding. Beveilig de server door het toegangstoken te valideren en als dit geldig is, wordt de aanvraag verwerkt.
Zie WebApiA
om uw -machtiging te maken.
Voeg WebApiA
machtiging toe en ververleent beheerderstoestemming voor uw webtoepassing.
Voeg de volgende afhankelijkheden toe aan uw pom.xml-bestand.
<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>
Voeg de volgende configuratie toe.
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}
Notitie
De waarden die zijn toegestaan voor tenant-id
zijn: common
, organizations
, consumers
of de tenant-id. Zie voor meer informatie over deze waarden het Het verkeerde eindpunt (persoonlijke en organisatieaccounts) gebruikt sectie van Fout AADSTS50020 - Gebruikersaccount van id-provider bestaat niet in tenant. Zie App met één tenant converteren naar multitenant op Microsoft Entra IDvoor meer informatie over het converteren van uw app met één tenant.
Schrijf uw Java-code.
Voor de controllercode kunt u het volgende voorbeeld raadplegen:
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.";
}
}
Raadpleeg het volgende voorbeeld voor uw beveiligingsconfiguratiecode:
@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();
}
}
Bouw en test uw app. Laat WebApiA
uitvoeren op poort 8081. Haal het toegangstoken op voor de webApiA
resource en open vervolgens http://localhost:8081/webApiA/sample
als de Bearer-autorisatieheader.
Gebruik 4: Resourceserver die toegang heeft tot andere resourceservers
Dit scenario is een upgrade van Toegang tot een resourceserveren ondersteunt toegang tot andere toepassingsresources, op basis van de OAuth2-clientreferentiestroom.
Als we naar de vorige stappen verwijzen, maken we een WebApiB
toepassing en maken we een toepassingsmachtiging beschikbaar 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"
}
Beheerderstoestemming verlenen voor WebApiB
machtigingen.
Voeg op basis van Toegang tot een resourceserverde volgende afhankelijkheid toe aan uw pom.xml-bestand.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Voeg de volgende configuratie toe op basis van de Toegang tot een resourceserver scenarioconfiguratie.
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
Schrijf uw Java-code.
Voor uw WebApiA
controllercode kunt u het volgende voorbeeld raadplegen:
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.");
}
}
Voor uw WebApiB
controllercode kunt u het volgende voorbeeld raadplegen:
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.";
}
}
Beveiligingsconfiguratiecode is hetzelfde met Toegang tot een resourceserver scenario. Er wordt als volgt een andere bean-webClient
toegevoegd
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Bouw en test uw app. Laat WebApiA
en WebApiB
worden uitgevoerd op respectievelijk poort 8081 en 8082. Start de WebApiA
- en WebApiB
-toepassingen, haal het toegangstoken op voor webApiA
resource en open http://localhost:8081/webApiA/webApiB/sample
als de Bearer-autorisatieheader.
Monsters
Zie de spring-cloud-azure-starter-active-directory-b2c-voorbeeldenvoor meer informatie.