Prise en charge de Spring Cloud Azure pour Spring Security
Cet article s’applique à :✅ version 4.19.0 ✅ version 5.19.0
Cet article décrit comment Spring Cloud Azure et Spring Security peuvent être utilisés ensemble.
Spring Security avec l’ID Microsoft Entra
Lorsque vous créez une application web, la gestion des identités et des accès est toujours des éléments fondamentaux.
Azure offre une excellente plateforme pour démocratiser votre parcours de développement d’applications, car elle offre non seulement un service d’identité de base cloud, mais également une intégration approfondie avec le reste de l’écosystème Azure.
Spring Security a facilité la sécurisation de vos applications Spring avec des abstractions puissantes et des interfaces extensibles. Toutefois, aussi puissante que l’infrastructure Spring peut être, elle n’est pas adaptée à un fournisseur d’identité spécifique.
Le spring-cloud-azure-starter-active-directory
offre le moyen le plus optimal de connecter votre application web à un locataire Microsoft Entra ID (Microsoft Entra ID for short) et de protéger votre serveur de ressources avec l’ID Microsoft Entra. Il utilise le protocole Oauth 2.0 pour protéger les applications web et les serveurs de ressources.
Accès à une application web
Ce scénario utilise le code d’autorisation OAuth 2.0 accorde flux pour vous connecter à un utilisateur avec un compte Microsoft.
Diagramme système
Créer des ressources requises dans Azure
Lisez démarrage rapide : Inscrivez une application auprès de la plateforme d’identités Microsoft.
Créez une inscription d’application. Obtenir
AZURE_TENANT_ID
,AZURE_CLIENT_ID
etAZURE_CLIENT_SECRET
.Définissez
redirect URI
surAPPLICATION_BASE_URI/login/oauth2/code/
, par exemplehttp://localhost:8080/login/oauth2/code/
. La/
de queue est requise.
Ajouter des dépendances requises
<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>
Ajouter des propriétés requises
spring:
cloud:
azure:
active-directory:
enabled: true
profile:
tenant-id: <tenant>
credential:
client-id: ${AZURE_CLIENT_ID}
client-secret: ${AZURE_CLIENT_SECRET}
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
À présent, démarrez votre application et accédez à votre application via le navigateur. Vous êtes redirigé vers la page de connexion Microsoft.
Utilisations avancées
Ajouter des configurations de sécurité supplémentaires
@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();
}
}
Autoriser l’accès par les rôles d’application
Créez des ressources requises dans Azure :
Lisez Ajouter des rôles d’application à votre application et recevez-les dans le jeton.
Créez un rôle d’application avec les paramètres suivants :
- Nom complet : Administrateur
- Types de membres autorisés : utilisateurs/groupes
- Valeur : Administrateur
- Voulez-vous activer ce rôle d’application : oui
Note
Si vous souhaitez utiliser le contrôle d’accès en fonction du rôle d’application, vous ne pouvez pas placer de noms de groupe dans la revendication role
. Pour plus d’informations, consultez la section Configuration des revendications facultatives des groupes de Fournir des revendications facultatives à votre application.
Protégez la méthode spécifique.
class Demo {
@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String admin() {
return "Admin message";
}
}
Autoriser l’accès par nom de groupe ou ID de groupe
Ajoutez les propriétés de configuration associées.
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
Protégez la méthode spécifique.
@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";
}
}
Utiliser Azure national au lieu d’Azure global
À présent, à l’exception du cloud Azure global, l’ID Microsoft Entra est déployé dans les clouds nationaux suivants :
Azure Government
Azure China 21Vianet
Azure Allemagne
Voici un exemple utilisant Azure China 21Vianet.
spring:
cloud:
azure:
active-directory:
enabled: true
base-uri: https://login.partner.microsoftonline.cn
graph-base-uri: https://microsoftgraph.chinacloudapi.cn
Pour plus d’informations, consultez déploiements de cloud nationaux.
Configurer le modèle d’URI de redirection
Les développeurs peuvent personnaliser l’URI de redirection.
Ajoutez redirect-uri-template
propriétés dans votre fichier application.yml.
spring:
cloud:
azure:
active-directory:
enabled: true
redirect-uri-template: ${REDIRECT-URI-TEMPLATE}
Mettez à jour redirect-uri
dans le portail Azure.
Après avoir défini redirect-uri-template
, nous devons mettre à jour le générateur de sécurité :
@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();
}
}
Connexion à l’ID Microsoft Entra via un proxy
Pour connecter Microsoft Entra ID via proxy, fournissez un RestTemplateCustomizer
bean comme celui indiqué dans l’exemple suivant :
@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);
};
}
}
Échantillons
Exemple de projet : aad-web-application .
Application web accédant aux serveurs de ressources
Diagramme système
Créer des ressources requises dans Azure
Lisez démarrage rapide : Inscrivez une application auprès de la plateforme d’identités Microsoft.
Créez une inscription d’application. Obtenir
AZURE_TENANT_ID
,AZURE_CLIENT_ID
etAZURE_CLIENT_SECRET
.Définissez
redirect URI
surAPPLICATION_BASE_URI/login/oauth2/code/
, par exemplehttp://localhost:8080/login/oauth2/code/
. La/
de queue est requise.
Ajouter des dépendances requises
<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>
Ajouter des propriétés requises
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Ici, graph
est le nom de OAuth2AuthorizedClient
, scopes
signifie que les étendues nécessaires au consentement lors de la connexion.
Utiliser OAuth2AuthorizedClient dans votre application
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);
}
}
À présent, démarrez votre application et accédez à votre application dans le navigateur. Ensuite, vous êtes redirigé vers la page de connexion Microsoft.
Utilisations avancées
Flux d’informations d’identification du client
Le flux par défaut est flux de code d’autorisation, si vous souhaitez utiliser flux d’informations d’identification du client, vous pouvez configurer comme suit :
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Accéder à plusieurs serveurs de ressources
Dans une application web, vous pouvez accéder à plusieurs serveurs de ressources en configurant comme suit :
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Vous pouvez ensuite utiliser OAuth2AuthorizedClient
dans l’application comme ceci
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);
}
}
Échantillons
Exemple de projet : aad-web-application .
Accès à un serveur de ressources
Ce scénario ne prend pas en charge la connexion, il vous suffit de protéger le serveur en validant le jeton d’accès. Si le jeton d’accès est valide, le serveur répond à la demande.
Diagramme système
Créer des ressources requises dans Azure
Lisez démarrage rapide : Inscrivez une application auprès de la plateforme d’identités Microsoft.
Créez une inscription d’application. Obtenir
AZURE_CLIENT_ID
.Lisez démarrage rapide : Configurer une application pour exposer uned’API web.
Exposez une API web avec une étendue nommée
Scope-1
.
Ajouter des dépendances requises
<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>
Ajouter des propriétés requises
spring:
cloud:
azure:
active-directory:
enabled: true
credential:
client-id: ${AZURE_CLIENT_ID}
Démarrez maintenant votre application et accédez à l’API web de votre application.
Vous obtiendrez 401 sans jeton d’accès.
Accédez à votre application avec un jeton d’accès. Les revendications suivantes dans le jeton d’accès sont validées :
iss
: le jeton d’accès doit être émis par l’ID Microsoft Entra.nbf
: l’heure actuelle ne peut pas être avantnbf
.exp
: l’heure actuelle ne peut pas aprèsexp
.aud
: sispring.cloud.azure.active-directory.credential.client-id
ouspring.cloud.azure.active-directory.credential.app-id-uri
configuré, l’audience doit être égale auclient-id
configuré ouapp-id-uri
. Si les deux propriétés ne sont pas configurées, cette revendication ne sera pas validée.
Pour plus d’informations sur le jeton d’accès, consultez documentation MS sur les jetons d’accès de plateforme d’identités Microsoft.
Utilisations avancées
Ajouter des configurations de sécurité supplémentaires
@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();
}
}
Valider l’autorisation par étendues
Créez des ressources requises dans Azure.
Lisez démarrage rapide : Configurer une application pour exposer uned’API web.
Exposez une API web avec une étendue nommée
Scope1
.
Protégez la méthode spécifique.
class Demo { @GetMapping("scope1") @ResponseBody @PreAuthorize("hasAuthority('SCOPE_Scope1')") public String scope1() { return "Congratulations, you can access `scope1` endpoint."; } }
En procédant ainsi, lorsque l’accès /scope1
point de terminaison, les revendications suivantes dans le jeton d’accès sont validées :
-
scp
: la valeur doit contenirScope1
.
Valider l’autorisation par les rôles d’application
Créez des ressources requises dans Azure.
Lisez Ajouter des rôles d’application à votre application et recevez-les dans le jeton.
Créez un rôle d’application avec les paramètres suivants :
- Nom complet : AppRole1
- Types de membres autorisés : utilisateurs/groupes
- Valeur : AppRole1
- Voulez-vous activer ce rôle d’application : oui
Protégez la méthode spécifique.
class Demo { @GetMapping("app-role1") @ResponseBody @PreAuthorize("hasAuthority('APPROLE_AppRole1')") public String appRole1() { return "Congratulations, you can access `app-role1` endpoint."; } }
En procédant ainsi, lorsque l’accès /app-role1
point de terminaison, les revendications suivantes dans le jeton d’accès sont validées :
-
roles
: la valeur doit contenirAppRole1
.
Utiliser l’authentification du client JWT
Pour utiliser un jeton web JSON (JWT) pour l’authentification du client, procédez comme suit :
- Consultez la section Inscrire votre certificat auprès de la plateforme d’identités Microsoft section informations d’identification de certificat d’authentification d’application de plateforme d’identités Microsoft.
- Chargez un certificat .pem sur l’application inscrite dans le portail Azure.
- Configurez le chemin d’accès et le mot de passe du certificat d’un . PFX ou . Certificat P12.
- Ajoutez la propriété
spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt
configuration au client à authentifier via l’authentification du client JWT.
L’exemple de fichier de configuration suivant concerne un scénario d’application web. Les informations de certificat sont configurées dans les propriétés globales.
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Vous pouvez également configurer les informations de certificat dans les propriétés du service active-directory
, comme illustré dans cet exemple :
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Connexion à l’ID Microsoft Entra via un proxy
Pour connecter Microsoft Entra ID via proxy, fournissez un RestTemplateCustomizer
bean. Pour plus d’informations, consultez la section Connexion à Microsoft Entra ID via proxy.
Échantillons
Exemple de projet : aad-resource-server .
Serveur de ressources visitant d’autres serveurs de ressources
Diagramme système
Créer des ressources requises dans Azure
Lisez démarrage rapide : Inscrivez une application auprès de la plateforme d’identités Microsoft.
Créez une inscription d’application. Obtenir
AZURE_TENANT_ID
,AZURE_CLIENT_ID
etAZURE_CLIENT_SECRET
.
Ajouter des dépendances requises
<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>
Ajouter des propriétés requises
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Utiliser OAuth2AuthorizedClient dans votre application
public class SampleController {
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
return callMicrosoftGraphMeEndpoint(graph);
}
}
Échantillons
Exemple de projet : aad-resource-server-obo.
Application web et serveur de ressources dans une application
Créer des ressources requises dans Azure
Lisez démarrage rapide : Inscrivez une application auprès de la plateforme d’identités Microsoft.
Créez une inscription d’application. Obtenir
AZURE_TENANT_ID
,AZURE_CLIENT_ID
etAZURE_CLIENT_SECRET
.
Ajouter des dépendances requises
<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>
Ajouter des propriétés requises
Définissez la propriété spring.cloud.azure.active-directory.application-type
sur web_application_and_resource_server
et spécifiez le type d’autorisation pour chaque client d’autorisation.
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Définir SecurityFilterChain
Configurez plusieurs instances SecurityFilterChain
.
AadWebApplicationAndResourceServerConfig
contient deux configurations de chaîne de filtre de sécurité pour le serveur de ressources et l’application web.
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadWebApplicationAndResourceServerConfig {
@Bean
@Order(1)
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())
.and()
// All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.
.securityMatcher("/api/**")
.authorizeHttpRequests()
.anyRequest().authenticated();
return http.build();
}
@Bean
public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {
// @formatter:off
http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
.and()
.authorizeHttpRequests()
.requestMatchers("/login").permitAll()
.anyRequest().authenticated();
// @formatter:on
return http.build();
}
}
Configuration
Propriétés configurables de spring-cloud-azure-starter-active-directory :
Nom | Description |
---|---|
spring.cloud.azure.active-directory.app-id-uri | URI d’ID d’application qui peut être utilisé dans la revendication « aud » d’un id_token. |
spring.cloud.azure.active-directory.application-type | Type de l’application Microsoft Entra. |
spring.cloud.azure.active-directory.authenticate-additional-parameters | Ajoutez des paramètres supplémentaires à l’URL d’autorisation. |
spring.cloud.azure.active-directory.authorization-clients | Clients d’autorisation OAuth2. |
spring.cloud.azure.active-directory.credential.client-id | ID client à utiliser lors de l’exécution de l’authentification du principal de service avec Azure. |
spring.cloud.azure.active-directory.credential.client-secret | Clé secrète client à utiliser lors de l’authentification du principal de service avec Azure. |
spring.cloud.azure.active-directory.jwk-set-cache-durée de vie | La durée de vie du JWK mis en cache défini avant son expiration, la valeur par défaut est de 5 minutes. |
spring.cloud.azure.active-directory.jwk-set-cache-refresh-time | L’heure d’actualisation du JWK mis en cache défini avant son expiration, la valeur par défaut est de 5 minutes. |
spring.cloud.azure.active-directory.jwt-connect-timeout | Délai d’expiration de connexion pour l’appel d’URL distante JWKSet. |
spring.cloud.azure.active-directory.jwt-read-timeout | Délai d’attente de lecture pour l’appel d’URL distante JWKSet. |
spring.cloud.azure.active-directory.jwt-size-limit | Limite de taille en octets de l’appel d’URL distante JWKSet. |
spring.cloud.azure.active-directory.post-logout-redirect-uri | URI de redirection après la déconnexion. |
spring.cloud.azure.active-directory.profile.cloud-type | Nom du cloud Azure auquel se connecter. Les types pris en charge sont : AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER. |
spring.cloud.azure.active-directory.profile.environment | Propriétés des points de terminaison Microsoft Entra. |
spring.cloud.azure.active-directory.profile.tenant-id | ID de locataire Azure. Les valeurs autorisées pour tenant-id sont : common , organizations , consumers ou l’ID de locataire. |
spring.cloud.azure.active-directory.redirect-uri-template | Point de terminaison de redirection : utilisé par le serveur d’autorisation pour renvoyer des réponses contenant des informations d’identification d’autorisation au client via l’agent utilisateur du propriétaire de la ressource. La valeur par défaut est {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map | Configurez la revendication qui sera utilisée pour générer GrantedAuthority et le préfixe de la valeur de chaîne de GrantedAuthority. La valeur par défaut est : « scp » -> « SCOPE_ », « roles » -> « APPROLE_ ». |
spring.cloud.azure.active-directory.resource-server.principal-claim-name | Configurez la revendication dans le jeton d’accès à retourner dans AuthenticatedPrincipal#getName. La valeur par défaut est « sub ». |
spring.cloud.azure.active-directory.session-stateless | Si true active le filtre d’authentification sans état AadAppRoleStatelessAuthenticationFilter. La valeur par défaut est false qui active AadAuthenticationFilter. |
spring.cloud.azure.active-directory.user-group.allowed-group-ids | Les ID de groupe peuvent être utilisés pour construire GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.allowed-group-names | Les noms de groupe peuvent être utilisés pour construire GrantedAuthority. |
spring.cloud.azure.active-directory.user-group.use-transitive-members | Si la valeur est « true », utilisez « v1.0/me/transitiveMemberOf » pour obtenir des membres. Sinon, utilisez « v1.0/me/memberOf ». La valeur par défaut est false . |
spring.cloud.azure.active-directory.user-name-attribute | Décidez quelle revendication doit être le nom du principal. |
Voici quelques exemples sur l’utilisation de ces propriétés :
Type d’application
Le type d’application peut être déduit des dépendances : spring-security-oauth2-client
ou spring-security-oauth2-resource-server
. Si la valeur déduite n’est pas la valeur souhaitée, vous pouvez spécifier le type d’application. Voici la table des valeurs valides et des valeurs déduites :
Type d’application de spring-cloud-azure-starter-active-directory
:
A une dépendance : spring-security-oauth2-client |
A une dépendance : spring-security-oauth2-resource-server |
Valeurs valides du type d’application | Valeur déduite |
---|---|---|---|
Oui | Non | web_application |
web_application |
Non | Oui | resource_server |
resource_server |
Oui | Oui |
web_application , resource_server , resource_server_with_obo , web_application_and_resource_server |
resource_server_with_obo |
Spring Security avec Azure Active Directory B2C
Azure Active Directory (Azure AD) B2C est un service de gestion des identités qui vous permet de personnaliser et de contrôler la façon dont les clients s’inscrivent, se connectent et gèrent leurs profils lors de l’utilisation de vos applications. Azure AD B2C permet ces actions tout en protégeant les identités de vos clients en même temps.
Configuration des dépendances
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>
</dependency>
</dependencies>
Configuration
Propriétés configurables de spring-cloud-azure-starter-active-directory-b2c :
Nom | Description |
---|---|
spring.cloud.azure.active-directory.b2c.app-id-uri | URI d’ID d’application qui peut être utilisé dans la revendication « aud » d’un jeton. |
spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters | Paramètres supplémentaires pour l’authentification. |
spring.cloud.azure.active-directory.b2c.authorization-clients | Spécifiez la configuration du client. |
spring.cloud.azure.active-directory.b2c.base-uri | URI de base du point de terminaison Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.credential | Informations d’identification Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.jwt-connect-timeout | Délai d’expiration de connexion pour l’appel d’URL distante JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-read-timeout | Délai d’attente de lecture pour l’appel d’URL distante JWKSet. |
spring.cloud.azure.active-directory.b2c.jwt-size-limit | Limite de taille en octets de l’appel d’URL distante JWKSet. |
spring.cloud.azure.active-directory.b2c.login-flow | Spécifiez la clé de flux de connexion principale. La valeur par défaut est sign-up-or-sign-in . |
spring.cloud.azure.active-directory.b2c.logout-success-url | URL de redirection après la déconnexion. La valeur par défaut est http://localhost:8080/login . |
spring.cloud.azure.active-directory.b2c.profile | Informations de profil Azure AD B2C. |
spring.cloud.azure.active-directory.b2c.reply-url | URL de réponse après obtention du code d’autorisation. La valeur par défaut est {baseUrl}/login/oauth2/code/ . |
spring.cloud.azure.active-directory.b2c.user-flow | Flux utilisateur. |
spring.cloud.azure.active-directory.b2c.user-name-attribute-name | Nom d’attribut de nom d’utilisateur. |
Pour obtenir des configurations complètes, vérifiez propriétés de configuration d’Azure Spring Cloud.
Utilisation de base
Une application web est une application web qui permet à l’utilisateur de se connecter avec l’ID Microsoft Entra, tandis qu’un serveur de ressources acceptera ou refusera l’accès après avoir validé access_token obtenu à partir de l’ID Microsoft Entra. Nous aborderons 4 scénarios dans ce guide :
Accès à une application web.
Application web accédant aux serveurs de ressources.
Accès à un serveur de ressources.
Serveur de ressources accédant à d’autres serveurs de ressources.
Utilisation 1 : Accès à une application web
Ce scénario utilise le code d’autorisation OAuth 2.0 accorde flux pour vous connecter à un utilisateur avec votre utilisateur Azure AD B2C.
Sélectionnez Azure AD B2C dans le menu du portail, sélectionnez Applications, puis Ajouter.
Spécifiez l' nom de votre application
Sélectionnez clés dans votre application, sélectionnez Générer de clé pour générer WEB_APP_AZURE_CLIENT_SECRET
, puis sélectionnez Enregistrer.
Sélectionnez flux utilisateur à gauche, puis sélectionnez nouveau flux utilisateur.
Choisissez s’inscrire ou dans, de modification de profil et Réinitialisation de mot de passe pour créer des flux utilisateur respectivement. Spécifiez votre flux utilisateur Nom et attributs utilisateur et revendications, puis sélectionnez Créer.
Sélectionnez autorisations d’API>Ajouter une autorisation>les API Microsoft, Microsoft Graph, sélectionnez autorisations déléguées, sélectionnez les autorisations offline_access et openid autorisations, puis sélectionnez Ajouter une autorisation pour terminer le processus.
Accordez le consentement de l’administrateur pour les autorisations graph
Ajoutez les dépendances suivantes à votre fichier pom.xml.
<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>
Ajoutez des propriétés à votre fichier application.yml à l’aide des valeurs que vous avez créées précédemment, comme illustré dans l’exemple suivant :
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}
Écrivez votre code Java.
Pour votre code de contrôleur, vous pouvez vous référer à l’exemple suivant :
@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";
}
}
Pour votre code de configuration de sécurité, vous pouvez vous référer à l’exemple suivant :
@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();
}
}
Copiez le home.html à partir de exemple aad-b2c-web-application, puis remplacez les PROFILE_EDIT_USER_FLOW
et les PASSWORD_RESET_USER_FLOW
par les noms de flux d’utilisateur que vous avez utilisés précédemment.
Générez et testez votre application. Laissez Webapp
s’exécuter sur le port 8080.
Une fois votre application générée et démarrée par Maven, ouvrez http://localhost:8080/
dans un navigateur web. Vous devez être redirigé vers la page de connexion.
Sélectionnez le lien avec le flux utilisateur de connexion. Vous devez être redirigé vers Azure AD B2C pour démarrer le processus d’authentification.
Une fois connecté, vous devez voir l’exemple de home page
à partir du navigateur.
Utilisation 2 : Application web accédant aux serveurs de ressources
Ce scénario est basé sur la l’accès à une application web scénario pour permettre à une application d’accéder à d’autres ressources. Ce scénario est les informations d’identification du client OAuth 2.0 accordent flux.
Sélectionnez Azure AD B2C dans le menu du portail, sélectionnez Applications, puis Ajouter.
Spécifiez le nom de votre application (par exemple webApiA
), enregistrez l’ID d’application en tant que WEB_API_A_AZURE_CLIENT_ID
, puis sélectionnez Enregistrer.
Sélectionnez clés dans votre application, sélectionnez Générer de clé pour générer WEB_API_A_AZURE_CLIENT_SECRET
, puis sélectionnez Enregistrer.
Sélectionnez Exposer un d’API dans le volet de navigation, puis sélectionnez Définir. Enregistrez l’URI d’ID d’application en tant que WEB_API_A_APP_ID_URL
, puis sélectionnez Enregistrer.
Sélectionnez manifeste dans le volet de navigation, puis collez le segment JSON suivant dans appRoles
tableau. Enregistrez l’URI d’ID d’application en tant que WEB_API_A_APP_ID_URL
, enregistrez la valeur du rôle d’application en tant que WEB_API_A_ROLE_VALUE
, puis sélectionnez Enregistrer.
{
"allowedMemberTypes": [
"Application"
],
"description": "WebApiA.SampleScope",
"displayName": "WebApiA.SampleScope",
"id": "04989db0-3efe-4db6-b716-ae378517d2b7",
"isEnabled": true,
"value": "WebApiA.SampleScope"
}
Sélectionnez autorisations d’API>Ajouter une autorisation>Mes API, sélectionnez nom de l’application WebApiA, Autorisations d’application, sélectionnez autorisation WebApiA.SampleScope, puis sélectionnez Ajouter une autorisation pour terminer le processus.
Accordez le consentement administrateur pour les autorisations de WebApiA.
Ajoutez la dépendance suivante en fonction de la l’accès à une application web scénario.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Ajoutez la configuration suivante en fonction de la l’accès à une application web scénario.
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
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Écrivez votre code Java Webapp
.
Pour votre code de contrôleur, vous pouvez vous référer à l’exemple suivant :
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.");
}
}
Le code de configuration de la sécurité est le même que dans le l’accès à une application web scénario. Ajoutez une autre webClient
bean comme suit :
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Pour écrire votre code Java WebApiA
, consultez la section Accès à un serveur de ressources.
Générez et testez votre application. Laissez Webapp
et WebApiA
s’exécuter sur le port 8080 et 8081 respectivement. Démarrez les applications Webapp
et WebApiA
. Revenez à la page d’accueil après la connexion réussie. Vous pouvez ensuite accéder à http://localhost:8080/webapp/webApiA
pour obtenir la réponse de ressource WebApiA
.
Utilisation 3 : Accès à un serveur de ressources
Ce scénario ne prend pas en charge la connexion. Protégez simplement le serveur en validant le jeton d’accès et, s’il est valide, il répond à la demande.
Pour générer votre autorisation de WebApiA
, consultez Utilisation 2 : Application web accédant aux serveurs de ressources.
Ajoutez WebApiA
autorisation et accordez le consentement administrateur pour votre application web.
Ajoutez les dépendances suivantes à votre fichier pom.xml.
<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>
Ajoutez la configuration suivante.
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}
Note
Les valeurs autorisées pour tenant-id
sont : common
, organizations
, consumers
ou l’ID de locataire. Pour plus d’informations sur ces valeurs, consultez le Utilisé le point de terminaison incorrect (comptes personnels et d’organisation) section Erreur AADSTS50020 - Le compte d’utilisateur du fournisseur d’identité n’existe pas dans ledu locataire. Pour plus d’informations sur la conversion de votre application monolocataire, consultez Convertir une application monolocataire en multilocataire sur Microsoft Entra ID.
Écrivez votre code Java.
Pour votre code de contrôleur, vous pouvez vous référer à l’exemple suivant :
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.";
}
}
Pour votre code de configuration de sécurité, vous pouvez vous référer à l’exemple suivant :
@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();
}
}
Générez et testez votre application. Laissez WebApiA
s’exécuter sur le port 8081. Obtenez le jeton d’accès de la ressource webApiA
, puis accédez à http://localhost:8081/webApiA/sample
en tant qu’en-tête d’autorisation du porteur.
Utilisation 4 : Serveur de ressources accédant à d’autres serveurs de ressources
Ce scénario est une mise à niveau de l’accès à un serveur de ressources, et prend en charge l’accès à d’autres ressources d’application, en fonction du flux d’informations d’identification du client OAuth2.
En faisant référence aux étapes précédentes, nous créons une application WebApiB
et exposons une autorisation d’application 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"
}
Accordez le consentement administrateur pour les autorisations de WebApiB
.
Sur la base de Accès à un serveur de ressources, ajoutez la dépendance suivante à votre fichier pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Ajoutez la configuration suivante en fonction du l’accès à un serveur de ressources configuration du scénario.
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
Écrivez votre code Java.
Pour votre code de contrôleur de WebApiA
, vous pouvez consulter l’exemple suivant :
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.");
}
}
Pour votre code de contrôleur de WebApiB
, vous pouvez consulter l’exemple suivant :
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.";
}
}
Le code de configuration de la sécurité est le même avec l’accès à un scénario de serveur de ressources, un autre webClient
bean est ajouté comme suit :
public class SampleConfiguration {
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction function =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);
return WebClient.builder()
.apply(function.oauth2Configuration())
.build();
}
}
Générez et testez votre application. Laissez WebApiA
et WebApiB
s’exécuter sur le port 8081 et 8082 respectivement. Démarrez les applications WebApiA
et WebApiB
, obtenez le jeton d’accès pour webApiA
ressource et accédez http://localhost:8081/webApiA/webApiB/sample
en tant qu’en-tête d’autorisation du porteur.
Échantillons
Pour plus d’informations, consultez les exemples spring-cloud-azure-starter-active-directory-b2c.