Sécuriser les applications Java Spring Boot à l’aide de groupes et de revendications de groupes.
Cet article montre une application web Java Spring Boot qui utilise la Bibliothèque cliente Spring Boot Starter de Microsoft Entra ID pour Java pour l’authentification, l’autorisation et l’acquisition de jetons. L’application utilise le protocole OpenID Connect pour connecter des utilisateurs et limite l’accès aux pages en fonction de l’appartenance au groupe de sécurité Microsoft Entra ID.
Le diagramme suivant illustre la topologie de l’application :
L’application cliente utilise la bibliothèque cliente Spring Boot Starter de Microsoft Entra ID pour Java dans le but de connecter des utilisateurs dans un locataire Microsoft Entra ID et d’obtenir un jeton d’ID à partir de Microsoft Entra ID.
Le jeton d’ID contient la revendication de groupes. L’application charge les revendications dans la liste GrantedAuthorities
Spring de l’utilisateur connecté. Ces valeurs déterminent les pages auxquelles l’utilisateur est autorisé à accéder.
Pour voir une vidéo qui couvre ce scénario, consultez Implémenter l’autorisation dans vos applications avec des rôles d’application, des groupes de sécurité, des étendues et des rôles d’annuaire.
Prérequis
- JDK version 15. Cet exemple a été développé sur un système avec Java 15, mais il peut être compatible avec d’autres versions.
- Maven 3
- Il est recommandé d’utiliser le pack d’extension Java pour Visual Studio Code pour exécuter cet exemple dans Visual Studio Code.
- Un locataire Microsoft Entra ID. Pour plus d’informations, consultez Démarrage rapide : Configurer un locataire.
- Un compte d’utilisateur dans votre locataire Microsoft Entra ID. Cet exemple ne fonctionne pas avec un compte Microsoft personnel. Par conséquent, si vous vous êtes connecté au portail Azure avec un compte personnel et que vous n’avez pas encore de compte d’utilisateur dans votre annuaire, vous devez en créer un.
- Deux groupes de sécurité, nommés
AdminGroup
etUserGroup
, contenant l’utilisateur ou les utilisateurs dont vous voulez qu’ils signent et testent cet exemple. Vous pouvez également ajouter l’utilisateur à deux groupes de sécurité existants dans votre locataire. Si vous choisissez d’utiliser des groupes existants, assurez-vous de modifier l’exemple de configuration pour utiliser le nom et l’ID d’objet de vos groupes de sécurité existants. - Visual Studio Code
- Outils Azure pour Visual Studio Code
Recommandations
- Un certaine connaissance de Spring Framework.
- Être familiarisé avec le terminal Linux/OSX.
- jwt.ms pour inspecter vos jetons.
- Fiddler pour la supervision de votre activité réseau et la résolution des problèmes.
- Suivez le blog Microsoft Entra ID pour rester au courant des dernières évolutions.
Configurer l’exemple
Les sections suivantes vous montrent comment configurer l’exemple d’application.
Clonez ou téléchargez l’exemple de dépôt
Pour cloner l’exemple, ouvrez une fenêtre Bash et utilisez la commande suivante :
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/3-Authorization-II/groups
Vous pouvez également accéder au dépôt ms-identity-msal-java-samples, puis le télécharger en tant que fichier .zip et l’extraire sur votre disque dur.
Important
Pour éviter les limitations de longueur de fichier sous Windows, clonez ou extrayez le dépôt dans un répertoire proche de la racine de votre disque dur.
Inscrivez l’exemple d’application auprès de votre locataire Microsoft Entra ID
Cet exemple contient un seul projet. Les sections suivantes vous montrent comment inscrire l’application à l’aide du Portail Azure.
Choisissez le locataire Microsoft Entra ID où vous voulez créer vos applications.
Pour choisir votre locataire, suivez les étapes ci-dessous :
Connectez-vous au portail Azure.
Si votre compte est présent dans plusieurs locataires Microsoft Entra ID, sélectionnez votre profil dans le coin du portail Azure, puis sélectionnez Changer d’annuaire pour faire correspondre votre session au locataire Microsoft Entra ID souhaité.
Inscrire l’application (java-spring-webapp-groups)
Pour inscrire l’application, effectuez les étapes suivantes :
Accédez au portail Azure, puis sélectionnez Microsoft Entra ID.
Dans le volet de navigation, sélectionnez Inscriptions d’applications, puis sélectionnez Nouvelle inscription.
Dans la page Inscrire une application qui s’affiche, saisissez les informations suivantes relatives à l’inscription de votre application :
- Dans la section Nom, saisissez un nom d’application cohérent qui s’affichera pour les utilisateurs de l’application, par exemple
java-spring-webapp-groups
. - Sous Types de comptes pris en charge, sélectionnez Comptes dans cet annuaire organisationnel uniquement.
- Dans la section URI de redirection (facultatif), sélectionnez Web dans la zone de liste modifiable et entrez l’URI de redirection suivant :
http://localhost:8080/login/oauth2/code/
.
- Dans la section Nom, saisissez un nom d’application cohérent qui s’affichera pour les utilisateurs de l’application, par exemple
Sélectionnez Inscrire pour créer l’application.
Dans la page d’inscription de l’application, recherchez et copiez la valeur ID d’application (client) pour l’utiliser ultérieurement. Vous utilisez cette valeur dans le ou les fichiers de configuration de votre application.
Sur la page d’inscription de l’application, sélectionnez Certificats et secrets dans le volet de navigation pour ouvrir la page permettant de générer des secrets et de charger des certificats.
Dans la section Secrets client, sélectionnez Nouveau secret client.
Saisissez une description (par exemple, secret de l’application).
Sélectionnez l’une des durées disponibles : 6 mois, 12 mois ou Personnalisée.
Sélectionnez Ajouter. La valeur générée s’affiche.
Copiez et sauvegardez la valeur générée pour l’utiliser dans les étapes ultérieures. Vous avez besoin de cette valeur pour les fichiers de configuration de votre code. Cette valeur n’apparaîtra plus, et vous ne pouvez pas la récupérer par d’autres moyens. Veillez donc à la sauvegarder à partir du portail Azure avant d’accéder un autre écran ou à un autre volet.
Sur la page d’inscription de l’application, sélectionnez Autorisations d’API dans le volet de navigation pour ouvrir la page permettant d’ajouter l’accès aux API dont votre application a besoin.
Sélectionnez Ajouter une autorisation.
Vérifiez ensuite que l’onglet API Microsoft est sélectionné.
Dans la section API Microsoft couramment utilisées, sélectionnez Microsoft Graph.
Dans la section Autorisations déléguées, sélectionnez GroupMember.Read.All dans la liste. Utilisez la zone de recherche au besoin. Cette autorisation est nécessaire pour obtenir des appartenances à un groupe via Graph si le scénario de dépassement se produit.
Sélectionnez le bouton pour accorder le consentement administrateur à
GroupMember.Read.All
.Sélectionnez Ajouter des autorisations.
Créer des groupes de sécurité
Pour créer des groupes de sécurité, procédez comme suit :
Accédez au portail Azure, puis sélectionnez Microsoft Entra ID.
Sélectionnez Groupes dans le volet de navigation.
Dans le volet Groupes , sélectionnez Nouveau groupe, puis fournissez les informations suivantes :
- Pour Type de groupe, sélectionnez Sécurité.
- Pour Nom de groupe, saisissez AdminGroup.
- Pour Description du groupe, saisissez Groupe de sécurité administrateur.
- Ajoutez les Propriétaires de groupe et les Membres de groupe que vous souhaitez utiliser et tester dans cet exemple.
- Sélectionnez Créer.
Dans le volet Groupes , sélectionnez Nouveau groupe, puis fournissez les informations suivantes :
- Pour Type de groupe, sélectionnez Sécurité.
- Pour Nom de groupe, saisissez UserGroup.
- Pour Description du groupe, saisissez Groupe de sécurité utilisateur.
- Ajoutez les Propriétaires de groupe et les Membres de groupe que vous souhaitez utiliser et tester dans cet exemple.
- Sélectionnez Créer.
Pour plus d’informations, consultez Gérer les groupes Microsoft Entra et l’appartenance aux groupes.
Configurer les groupes de sécurité
Vous disposez des options suivantes pour configurer votre application afin qu’elle reçoive les revendications des groupes :
Recevoir tous les groupes auxquels l’utilisateur connecté est affecté dans un locataire Microsoft Entra ID, y compris les groupes imbriqués. Pour en savoir plus, consultez la section Configurer votre application pour recevoir tous les groupes auxquels l’utilisateur connecté est affecté, y compris les groupes imbriqués.
Recevoir les valeurs des revendications des groupes d’un ensemble filtré de groupes avec lequel votre application est programmée pour fonctionner. Pour en savoir plus, consultez la section Configurer votre application pour recevoir les valeurs des revendications des groupes d’un ensemble filtré de groupes auxquels un utilisateur peut être affecté. Cette option n’est pas disponible dans l’édition gratuite de Microsoft Entra ID.
Remarque
Pour obtenir le samAccountName
ou l On Premises Group Security Identifier
au lieu de l’ID de groupe, consultez la section Conditions préalables à l’utilisation d’attributs de groupe synchronisés à partir d’Active Directory dans Configurer des revendications de groupe pour des applications à l’aide de Microsoft Entra ID.
Configurez votre application pour recevoir tous les groupes auxquels l’utilisateur connecté est affecté, y compris les groupes imbriqués
Pour configurer l’application, procédez comme suit :
Sur la page d’inscription de l’application, sélectionnez Configuration du jeton dans le volet de navigation, pour ouvrir la page qui vous permet de configurer les jetons fournis par les revendications émis pour votre application.
Sélectionnez Ajouter une revendication de groupe pour ouvrir l’écran Modifier la revendication de groupes.
Sélectionnez Groupes de sécurité OU Tous les groupes (inclut les listes de distribution mais pas les groupes affectés à l’application). Le fait de choisir les deux annule l’effet de l’option Groupes de sécurité.
Dans la section ID, sélectionnez ID de groupe. Cette sélection fait que Microsoft Entra ID envoie l’ID d’objet des groupes auxquels l’utilisateur est affecté dans la revendication de groupe du jeton d’ID reçu par votre application après la connexion d’un utilisateur.
Configurer votre application pour recevoir les valeurs de revendication de groupes d’un ensemble filtré de groupes auxquels un utilisateur peut être affecté
Cette option est utile dans les cas suivants :
- Votre application s’intéresse à un ensemble sélectionné de groupes auxquels un utilisateur de connexion peut être affecté.
- Votre application n’est pas intéressée par chaque groupe de sécurité auquel cet utilisateur est affecté dans le locataire.
Cette option permet à votre application d’éviter le problème du dépassement.
Remarque
Cette fonctionnalité n’est pas disponible dans l’édition gratuite de Microsoft Entra ID.
Les affectations de groupe imbriquées ne sont pas disponibles avec cette option.
Pour activer cette option dans votre application, suivez les étapes ci-dessous :
Sur la page d’inscription de l’application, sélectionnez Configuration du jeton dans le volet de navigation, pour ouvrir la page qui vous permet de configurer les jetons fournis par les revendications émis pour votre application.
Sélectionnez Ajouter une revendication de groupe pour ouvrir l’écran Modifier la revendication de groupes.
Sélectionnez Groupes affectés à l’application et ne sélectionnez aucune autre option. Si vous choisissez d’autres options, telles que Groupes de sécurité ou Tous les groupes (inclut les listes de distribution, mais pas les groupes affectés à l’application), ces options annulent l’effet de l’option Groupes affectés à l’application.
Dans la section ID, sélectionnez ID de groupe. Cette sélection fait que Microsoft Entra ID envoie l’ID d’objet des groupes auxquels l’utilisateur est affecté dans la revendication de groupe du jeton d’ID reçu par votre application après la connexion d’un utilisateur.
Si vous exposez une API web à l’aide de l’option Exposer une API, vous pouvez également choisir l’option ID de groupe dans la section Accès. Cette sélection entraîne l’envoi par Microsoft Entra ID de l’ID d’objet des groupes auxquels l’utilisateur est affecté dans la revendication de groupes du jeton d’accès émis aux applications clientes de votre API.
Dans la page d’inscription de l’application, sélectionnez Vue d’ensemble dans le volet de navigation pour ouvrir l’écran vue d’ensemble de l’application.
Sélectionnez le lien portant le nom de votre application, sous Application managée dans l’annuaire local. Le titre de ce champ peut être tronqué, par exemple, Application managées dans.... Lorsque vous sélectionnez ce lien, vous accédez à la page Vue d’ensemble de l’application d’entreprise associée au principal de service de votre application dans le locataire où vous l’avez créée. Vous pouvez revenir à la page d’inscription d’application à l’aide du bouton Précédent de votre navigateur.
Sélectionnez Utilisateurs et groupes dans le volet de navigation pour ouvrir la page dans laquelle vous pouvez affecter des utilisateurs et des groupes à votre application.
Sélectionnez Ajouter un utilisateur.
Sélectionnez Utilisateur et groupes dans l’écran qui apparaît.
Choisissez les groupes que vous souhaitez affecter à cette application.
Sélectionnez Sélectionner pour terminer la sélection des groupes.
Sélectionnez Affecter pour terminer le processus d’affectation de groupe.
Votre application reçoit maintenant ces groupes sélectionnés dans la revendication de groupes lorsqu’un utilisateur qui se connecte à votre application est membre d’un ou plusieurs de ces groupes affectés.
Sélectionnez Propriétés dans le volet de navigation pour ouvrir la page qui répertorie les propriétés de base de votre application. Définissez l’indicateur Affectation de l’utilisateur obligatoire ? sur Oui.
Important
Lorsque vous définissez Affectation d’utilisateurs requise ? sur Oui, Microsoft Entra ID vérifie que seuls les utilisateurs affectés à votre application dans le volet Utilisateurs et groupes sont en mesure de se connecter à votre application. Vous pouvez affecter des utilisateurs directement ou en affectant des groupes de sécurité auxquels ils appartiennent.
Configurez votre exemple de code pour utiliser vos groupes d’inscription et de sécurité d’application (java-spring-webapp-groups)
Pour configurer l’application, procédez comme suit :
Remarque
Dans les étapes suivantes, ClientID
est identique à Application ID
ou AppId
.
Ouvrez le projet dans votre IDE.
Ouvrez le fichier src\main\resources\application.yml.
Recherchez l’espace réservé
Enter_Your_Tenant_ID_Here
et remplacez la valeur existante par l’ID de votre locataire Microsoft Entra.Recherchez l’espace réservé
Enter_Your_Client_ID_Here
et remplacez la valeur existante par l’ID d’application ou l’clientId
de l’applicationjava-spring-webapp-groups
que vous avez copié à partir du portail Azure.Recherchez l’espace réservé
Enter_Your_Client_Secret_Here
et remplacez la valeur existante par celle que vous avez enregistrée lors de la création dejava-spring-webapp-groups
que vous avez copié dans le portail Azure.Recherchez l’espace réservé
Enter_Your_Admin_Group_ID_Here
et remplacez la valeur existante par la valeurobjectId
de votre AdminGroup.Recherchez l’espace réservé
Enter_Your_User_Group_ID_Here
et remplacez la valeur existante par la valeurobjectId
de votre UserGroup.Ouvrez le fichier src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java.
Recherchez l’espace réservé
Enter_Your_Admin_Group_ID_Here
et remplacez la valeur existante par la valeurobjectId
de votre AdminGroup.Recherchez l’espace réservé
Enter_Your_User_Group_ID_Here
et remplacez la valeur existante par la valeurobjectId
de votre UserGroup.
Exécution de l'exemple
Les sections suivantes vous expliquent comment déployer l’exemple sur Azure Container Apps.
Prérequis
- Un compte Azure. Si vous n’en avez pas, créez un compte gratuit. Vous avez besoin de l’autorisation Contributeur ou Propriétaire sur l’abonnement Azure pour continuer. Pour plus d’informations, consultez Attribuer des rôles Azure en utilisant le portail Azure.
- Interface de ligne de commande Azure.
- Extension CLI Azure Container Apps, version
0.3.47
ou ultérieure. Utilisez la commandeaz extension add --name containerapp --upgrade --allow-preview
pour installer la dernière version. - Java Development Kit (JDK), version 17 ou supérieure.
- Maven.
Préparer le projet Spring
Suivez la procédure ci-dessous pour préparer le projet :
Utilisez la commande Maven suivante pour générer le projet :
mvn clean verify
Exécutez l’exemple de projet localement à l’aide de la commande suivante :
mvn spring-boot:run
Programme d’installation
Pour vous connecter à Azure à partir de l’interface CLI, exécutez la commande suivante et suivez les invites pour procéder à l’authentification.
az login
Pour être sûr d’utiliser la dernière version de l’interface CLI, exécutez la commande de mise à niveau.
az upgrade
Ensuite, installez ou mettez à jour l’extension Azure Container Apps pour l’interface CLI.
Si vous recevez des erreurs concernant des paramètres manquants lorsque vous exécutez des commandes az containerapp
dans Azure CLI, vérifiez que la dernière version de l’extension Azure Container Apps est installée.
az extension add --name containerapp --upgrade
Remarque
À compter de mai 2024, les extensions Azure CLI n’activent plus les fonctionnalités en préversion par défaut. Pour accéder aux fonctionnalités en préversion de Container Apps, installez l’extension Container Apps avec --allow-preview true
.
az extension add --name containerapp --upgrade --allow-preview true
Maintenant que la version actuelle de l’extension ou du module est installée, inscrivez les espaces de noms Microsoft.App
et Microsoft.OperationalInsights
.
Remarque
Les ressources Azure Container Apps ont migré de l’espace de noms Microsoft.Web
vers l’espace de noms Microsoft.App
. Pour plus d’informations, reportez-vous à Migration de l’espace de noms de Microsoft.Web vers Microsoft.App en mars 2022.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Créer l’environnement Azure Container Apps
À présent que votre configuration Azure CLI est terminée, vous pouvez définir les variables d’environnement utilisées dans cet article.
Définissez les variables suivantes dans votre interpréteur de commandes Bash.
export RESOURCE_GROUP="ms-identity-containerapps"
export LOCATION="canadacentral"
export ENVIRONMENT="env-ms-identity-containerapps"
export API_NAME="ms-identity-api"
export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"
Créez un groupe de ressources.
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION \
Créer un environnement avec un espace de travail Log Analytics généré automatiquement.
az containerapp env create \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Afficher le domaine par défaut de l’environnement d’application conteneur. Notez ce domaine à utiliser dans les sections ultérieures.
az containerapp env show \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--query properties.defaultDomain
Préparer l’application pour le déploiement
Lorsque vous déployez votre application dans Azure Container Apps, votre URL de redirection devient l’URL de redirection de votre instance d’application déployée dans Azure Container Apps. Suivez les étapes ci-dessous pour modifier ces paramètres dans votre fichier application.yml :
Naviguez jusqu’au fichier src\main\resources\application.yml de votre application et remplacez la valeur
post-logout-redirect-uri
par le nom de domaine de votre application déployée, comme indiqué dans l’exemple suivant. Veillez à remplacer<API_NAME>
et<default-domain-of-container-app-environment>
avec vos valeurs réelles : Par exemple, avec le domaine par défaut de votre environnement Azure Container App à l’étape précédente etms-identity-api
pour le nom de votre application, vous devez utiliserhttps://ms-identity-api.<default-domain>
pour la valeurpost-logout-redirect-uri
.post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
Après avoir enregistré ce fichier, utilisez la commande suivante pour reconstruire votre application :
mvn clean package
Important
Le fichier application.yml de l’application contient actuellement la valeur de votre secret client dans le paramètre client-secret
. Il n’est pas judicieux de conserver cette valeur dans ce fichier. Vous pouvez également prendre un risque en délivrant le fichier à un dépôt Git. Pour obtenir l’approche recommandée, consultez Gérer les secrets dans Azure Container Apps.
Mettez à jour l’enregistrement de votre application Microsoft Entra ID
Étant donné que l’URI de redirection change pour votre application déployée sur Azure Container Apps, vous devez également modifier l’URI de redirection dans votre enregistrement d’application Microsoft Entra ID. Pour cela, effectuez les étapes suivantes :
Accédez à la page Inscriptions d’applications de la plateforme d’identités Microsoft pour les développeurs.
Utilisez le champ de recherche pour rechercher l’enregistrement de votre application - par exemple,
java-servlet-webapp-authentication
.Ouvrez votre enregistrement d’application en sélectionnant son nom.
Sélectionnez Authentification dans le menu déroulant.
Dans la section Web - Redirection des URI, sélectionnez Ajouter un URI.
Remplissez l’URI de votre application, en ajoutant
/login/oauth2/code/
- par exemple,https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/
.Cliquez sur Enregistrer.
Déployer l’application
Déployez le package JAR sur Azure Container Apps.
Remarque
Si nécessaire, vous pouvez spécifier la version de JDK dans les variables d’environnement de génération Java. Pour en savoir plus, consultez Créer des variables d’environnement pour Java dans Azure Container Apps.
Vous pouvez maintenant déployer votre fichier WAR avec la commande CLI az containerapp up
.
az containerapp up \
--name $API_NAME \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--environment $ENVIRONMENT \
--artifact <JAR_FILE_PATH_AND_NAME> \
--ingress external \
--target-port 8080 \
--query properties.configuration.ingress.fqdn
Remarque
La version par défaut du JDK est la version 17. Si vous devez changer la version de JDK pour qu’elle soit compatible avec votre application, vous pouvez utiliser l’argument --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>
pour ajuster le numéro de version.
Pour en savoir plus sur la génération de variables d’environnement, consultez Générer des variables d’environnement pour Java dans Azure Container Apps.
Validez l’application
Dans cet exemple, la commande containerapp up
inclut l’argument --query properties.configuration.ingress.fqdn
qui renvoie le nom de domaine complet (FQDN), également appelé URL de l’application. Procédez comme suit pour vérifier les journaux d’activité de l’application afin d’identifier un éventuel problème de déploiement :
Accédez à l’URL de l’application de sortie à partir de la page Sorties de la section Déploiement.
Dans le volet de navigation de la page Vue d’ensemble de l’instance Azure Container Apps, sélectionnez Journaux d’activité pour vérifier les journaux d’activité de l’application.
Explorer l’exemple
Procédez comme suit pour examiner l’exemple :
- Notez l’état de connexion ou de déconnexion qui s’affiche au centre de l’écran.
- Sélectionnez le bouton contextuel dans le coin. Ce bouton indique Connexion lorsque vous exécutez l’application pour la première fois. Vous pouvez également sélectionner détails du jeton, administrateurs uniquement ou utilisateurs habituels. Étant donné que ces pages sont protégée et nécessitent une authentification, vous êtes automatiquement redirigé vers la page de connexion.
- Suivez les instructions de la page suivante et connectez-vous avec un compte dans le locataire Microsoft Entra ID.
- Sur l’écran de consentement, notez les portées demandées.
- Une fois le processus de connexion terminé, vous devez être redirigé vers la page d’accueil, qui affiche l’état de connexion ou l’une des autres pages, selon le bouton qui a déclenché votre processus de connexion.
- Notez que le bouton contextuel indique maintenant Déconnexion et affiche votre nom d’utilisateur.
- Si vous vous trouvez sur la page d’accueil, sélectionnez Détails du jeton d’ID pour voir certaines des revendications décodées du jeton d’ID, y compris les groupes.
- Sélectionnez Administrateurs uniquement pour afficher
/admin_only
. Seuls les utilisateurs appartenant au groupe de sécuritéAdminGroup
peuvent afficher cette page. Pour les autres, un message d’échec d’autorisation s’affiche. - Sélectionnez Utilisateurs habituels pour afficher la page
/regular_user
. Seuls les utilisateurs appartenant au groupe de sécuritéUserGroup
peuvent afficher cette page. Pour les autres, un message d’échec d’autorisation s’affiche. - Utilisez le bouton dans le coin pour vous déconnecter. La page d’état reflète le nouvel état.
À propos du code
Cet exemple montre comment utiliser la bibliothèque cliente Spring Boot Starter de Microsoft Entra ID pour Java en vue de connecter des utilisateurs à votre locataire Microsoft Entra ID. L’exemple utilise également le client Spring Oauth2 et les boot starters Spring Web. L’exemple utilise les revendications du jeton d’ID obtenu à partir de Microsoft Entra ID pour afficher les détails de l’utilisateur connecté et pour restreindre l’accès à certaines pages à l’aide de la revendication de groupes pour l’autorisation.
Contenu
Le tableau suivant montre le contenu de l’exemple de dossier du projet :
Fichier/Dossier | Description |
---|---|
pom.xml | Dépendances de l’application. |
src/main/resources/templates/ | Modèles Thymeleaf pour l’interface utilisateur. |
src/main/resources/application.yml | Configuration de la bibliothèque de l’application et de Microsoft Entra ID Boot Starter. |
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | Ce répertoire contient le point d’entrée, le contrôleur et les classes de configuration principaux de l’application. |
.../MsIdentitySpringBootWebappApplication.java | Classe principale. |
.../SampleController.java | Contrôleur avec mappages de point de terminaison. |
.../SecurityConfig.java | Configuration de la sécurité : par exemple, quels itinéraires nécessitent une authentification. |
.../Utilities.java | Classe Utility : par exemple, filtrer les revendications de jeton d’ID. |
CHANGELOG.md | Liste des modifications apportées à l’exemple. |
CONTRIBUTING.md | Instructions pour contribuer à l’exemple. |
LICENCE | Licence de l’exemple. |
Revendications de jetons d’ID
Pour extraire les détails du jeton, l’application utilise l’objet AuthenticationPrincipal
et OidcUser
de Spring Security dans un mappage de requête, comme illustré dans l’exemple suivant. Pour en savoir plus sur la façon dont cette application utilise les revendications de jetons d’ID, consultez le contrôleur d’exemple.
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
//...
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Map<String, Object> claims = principal.getIdToken().getClaims();
}
Traiter une revendication de groupe dans le jeton d’ID
La revendication de groupes du jeton inclut les noms des groupes auxquels l’utilisateur connecté est affecté, comme dans l’exemple suivant :
{
...
"groups": [
"xyz-id-xyz",
"xyz-id-xyz",]
...
}
Un moyen courant d’accéder aux noms de groupe est expliqué dans la section revendications de jeton d’ID.
Microsoft Entra ID Boot Starter v3.5 et les versions ultérieures analyse automatiquement les revendications des groupes et ajoute chaque groupe aux Authorities
de l’utilisateur connecté. Cette configuration permet aux développeurs d’utiliser des groupes avec des annotations de condition Spring PrePost
à l’aide de la méthode hasAuthority
. Par exemple, vous trouverez les conditions @PreAuthorize
suivantes présentées dans SampleController.java :
@GetMapping(path = "/admin_only")
@PreAuthorize("hasAuthority('enter-admin-group-id-here')")
public String adminOnly(Model model) {
// restrict to users who belong to AdminGroup
}
@GetMapping(path = "/regular_user")
@PreAuthorize("hasAnyAuthority('enter-user-group-id-here','enter-admin-group-id-here')")
public String regularUser(Model model) {
// restrict to users who belong to any of UserGroup or AdminGroup
}
Le code suivant obtient une liste complète des autorités pour un utilisateur donné :
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();
}
Liens de connexion et de déconnexion
Pour la connexion, l’application envoie une demande au point de terminaison de connexion Microsoft Entra ID automatiquement configuré par la bibliothèque cliente Spring Boot Starter de Microsoft Entra ID pour Java, comme le montre l’exemple suivant :
<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
Pour la déconnexion, l’application effectue une requête POST au point de terminaison logout
, comme indiqué dans l’exemple suivant :
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
Éléments d’interface utilisateur dépendant de l’authentification
L’application est dotée d’une logique simple dans les pages modèles de l’interface utilisateur pour déterminer le contenu à afficher en fonction de l’authentification de l’utilisateur, comme le montre l’exemple suivant qui utilise les balises Spring Security Thymeleaf :
<div sec:authorize="isAuthenticated()">
this content only shows to authenticated users
</div>
<div sec:authorize="isAnonymous()">
this content only shows to not-authenticated users
</div>
Protéger les itinéraires avec AADWebSecurityConfigurerAdapter
Par défaut, l’application protège les pages Détails du jeton d’ID, Administrateurs uniquement et Utilisateurs habituels afin que seuls les utilisateurs connectés puissent y accéder. L’application configure ces itinéraires à l’aide de la propriété app.protect.authenticated
à partir du fichier application.yml. Pour configurer les exigences spécifiques de votre application, vous pouvez étendre AADWebSecurityConfigurationAdapter
dans l’une de vos classes. Pour obtenir un exemple, consultez la classe SecurityConfig de cette application, illustrée dans le code suivant :
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends AADWebSecurityConfigurerAdapter{
@Value( "${app.protect.authenticated}" )
private String[] protectedRoutes;
@Override
public void configure(HttpSecurity http) throws Exception {
// use required configuration form AADWebSecurityAdapter.configure:
super.configure(http);
// add custom configuration:
http.authorizeRequests()
.antMatchers(protectedRoutes).authenticated() // limit these pages to authenticated users (default: /token_details, /admin_only, /regular_user)
.antMatchers("/**").permitAll(); // allow all other routes.
}
}
Revendication de dépassement des groupes
Pour s’assurer que la taille du jeton ne dépasse pas les limites de taille d’en-tête HTTP, la plateforme d’identité Microsoft limite le nombre d’ID d’objets inclus dans la revendication des groupes.
La limite de dépassement est de 150 pour les jetons SAML, de 200 pour les jetons JWT et de 6 pour les applications Single Page. Si un utilisateur est membre d’un nombre de groupes supérieur à la limite de dépassement, la plateforme d’identité Microsoft n’émet pas les ID de groupe dans les groupes revendiqués dans le jeton. Au lieu de cela, il inclut une revendication de dépassement dans le jeton qui indique à l’application d’interroger l’Microsoft Graph API pour récupérer l’appartenance de groupe de l’utilisateur.
Microsoft Entra ID Boot Starter v3.5 et les versions ultérieures analyse automatiquement les revendications des groupes et ajoute chaque groupe aux Authorities
de l’utilisateur connecté. Le démarrage gère automatiquement le scénario de dépassement de groupe.
Remarque
Nous vous conseillons vivement d’utiliser la fonctionnalité de filtrage de groupe, le cas échéant, pour éviter que des dépassements de groupe ne surviennent. Pour en savoir plus, consultez la section Configurer votre application pour recevoir les valeurs des revendications des groupes d’un ensemble filtré de groupes auxquels un utilisateur peut être affecté.
Créer le scénario de dépassement pour les tests
Vous pouvez utiliser le fichier BulkCreateGroups.ps1 fourni dans le dossier AppCreationScripts pour créer un grand nombre de groupes et leur affecter des utilisateurs. Ce fichier permet de tester les scénarios de dépassement pendant le développement. N’oubliez pas de modifier l’objectId
de l’utilisateur fournie dans le script BulkCreateGroups.ps1.
La gestion du dépassement nécessite un appel à Microsoft Graph pour lire les appartenances de groupe de l’utilisateur connecté. Par conséquent, votre application doit disposer des autorisations User.Read et GroupMember.Read.All pour que la fonction getMemberGroups s’exécute correctement.
Important
Pour le scénario de dépassement, vérifiez que vous avez accordé le Admin Consent
pour l’étendue GroupMember.Read.All
de l’API Microsoft Graph pour les applications clientes et de service. Pour en savoir plus, consultez les étapes d’inscription de l’application plus haut dans cet article.
Mettre à jour l’inscription de l’application ID Microsoft Entra (java-spring-webapp-groups)
Pour mettre à jour l’inscription de l’application, procédez comme suit :
Revenez au portail Azure.
Dans le volet de navigation, sélectionnez Azure Active Directory,puis Inscriptions d’applications (préversion).
Dans l’écran qui s’affiche, sélectionnez l’application
java-spring-webapp-groups
.Sur la page d’inscription de l’application, sélectionnez Authentification dans le menu.
Dans la section URI de redirection, mettez à jour les URL de réponse pour qu’elles correspondent à l’URL du site de votre déploiement Azure, par exemple
https://java-spring-webapp-groups.azurewebsites.net/login/oauth2/code/
.
Important
Si votre application utilise un stockage en mémoire , Azure App Services arrête votre site Web s’il est inactif tous les enregistrements que votre application conservait sont vidés. En outre, si vous augmentez le nombre d’instances de votre site Web, les requêtes sont distribuées entre ces dernières. Par conséquent, vos enregistrements d’applications ne sont pas identiques sur chaque instance.
Plus d’informations
- Documentation sur la plateforme d’identités Microsoft
- Présentation de la bibliothèque d’authentification Microsoft (MSAL)
- Démarrage rapide : Inscrire une application à l’aide de la plateforme d’identités Microsoft
- Démarrage rapide : configurer une application cliente pour accéder aux API web.
- Comprendre les expériences de consentement à l’application Microsoft Entra ID
- Comprendre le consentement de l’utilisateur et de l’administrateur
- Objets application et principal du service dans Azure Active Directory
- Clouds nationaux
- Exemples de code MSAL
Pour en savoir plus sur le fonctionnement des protocoles OAuth 2.0 dans ce scénario et dans d’autres, consultez Scénarios d’authentification pour Microsoft Entra ID.