Proteger aplicaciones Java de Spring Boot mediante grupos y notificaciones de grupo
En este artículo se muestra una aplicación web de Java Spring Boot que usa la biblioteca cliente de Spring Boot Starter de Microsoft Entra ID para Java para la autenticación, autorización y adquisición de tokens. La aplicación usa el protocolo OpenID Connect para iniciar sesión de usuarios y restringe el acceso a páginas basadas en la pertenencia a grupos de seguridad de Microsoft Entra ID.
En el siguiente diagrama se muestra la topología de la aplicación:
La aplicación cliente usa la biblioteca cliente de Spring Boot Starter de Microsoft Entra ID para Java para iniciar sesión de usuarios en un inquilino de Microsoft Entra ID y obtener un token de identificador de Microsoft Entra ID.
El token de identificador contiene la notificación de grupos. La aplicación carga notificaciones en la lista GrantedAuthorities
de Spring para el usuario que ha iniciado sesión. Estos valores determinan las páginas a las que está autorizado el usuario para acceder.
Para ver un vídeo que trata este escenario, consulte Implementación de la autorización en las aplicaciones mediante roles de aplicación, grupos de seguridad, ámbitos y roles de directorio.
Requisitos previos
- JDK versión 15. Este ejemplo se desarrolló en un sistema con Java 15, pero podría ser compatible con otras versiones.
- Maven 3
- Se recomienda Java Extension Pack para Visual Studio Code para ejecutar este ejemplo en Visual Studio Code.
- Un inquilino de Microsoft Entra ID. Para más información, consulte Inicio rápido: configuración de un inquilino.
- Una cuenta de usuario en su inquilino de Microsoft Entra ID. Este ejemplo no funcionará con una cuenta Microsoft personal. Por lo tanto, si ha iniciado sesión en Azure Portal con una cuenta personal y nunca ha creado una cuenta de usuario en el directorio, deberá hacerlo ahora.
- Dos grupos de seguridad, denominados
AdminGroup
yUserGroup
, que contienen el usuario o los usuarios que desea firmar y probar en este ejemplo. Como alternativa, puede agregar el usuario a dos grupos de seguridad existentes en el inquilino. Si decide usar grupos existentes, asegúrese de modificar la configuración de ejemplo para usar el nombre y el identificador de objeto de los grupos de seguridad existentes. - Visual Studio Code
- Azure Tools para Visual Studio Code
Recomendaciones
- Cierta familiaridad con Spring Framework.
- Cierta familiaridad con el terminal Linux/OSX.
- jwt.ms para inspeccionar los tokens.
- Fiddler para supervisar la actividad de red y la solución de problemas.
- Siga el blog de Microsoft Entra ID para mantenerse al día con los últimos desarrollos.
Configuración del ejemplo
En las secciones siguientes se muestra cómo configurar la aplicación de ejemplo.
Clonación o descarga del repositorio de ejemplo
Para clonar el ejemplo, abra una ventana de Bash y use el siguiente comando:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 4-spring-web-app/3-Authorization-II/groups
Como alternativa, vaya al repositorio ms-identity-msal-java-samples y, a continuación, descárguelo como un archivo .zip y extráigalo en el disco duro.
Importante
Para evitar las limitaciones de longitud de la ruta de los archivos en Windows, clone o extraiga el repositorio en un directorio cerca de la raíz del disco duro.
Registro de la aplicación de ejemplo con el inquilino de Microsoft Entra ID
En este ejemplo hay un proyecto. En las secciones siguientes se muestra cómo registrar la aplicación mediante Azure Portal.
Selección del inquilino de Microsoft Entra ID el que quiere crear las aplicaciones
Para elegir el inquilino, siga estos pasos:
Inicie sesión en Azure Portal.
Si su cuenta existe en más de un inquilino de Microsoft Entra ID, seleccione el perfil en la esquina de Azure Portal y seleccione Cambiar directorio para modificar la sesión al inquilino de Microsoft Entra ID que desee.
Registro de la aplicación (java-spring-webapp-groups)
Para registrar la aplicación, siga estos pasos:
Vaya a Azure Portal y seleccione Microsoft Entra ID.
Seleccione Registros de aplicaciones en el panel de navegación y, a continuación, seleccione Nuevo registro.
En la página Registrar una aplicación que aparece, escriba la siguiente información de registro de la aplicación:
- En la sección Nombre, escriba un nombre significativo de la aplicación, que se mostrará a los usuarios de la aplicación, por ejemplo,
java-spring-webapp-groups
. - En Tipos de cuenta admitidos, selecciona Solo las cuentas de este directorio organizativo.
- En la sección URI de redirección (opcional), seleccione Web en el cuadro combinado y escriba los siguientes URI de redirección:
http://localhost:8080/login/oauth2/code/
.
- En la sección Nombre, escriba un nombre significativo de la aplicación, que se mostrará a los usuarios de la aplicación, por ejemplo,
Seleccione Registrar para crear la aplicación.
En la página de registro de la aplicación, busque y copie el valor del identificador de la aplicación (cliente) para usarlo más adelante. Este valor se usa en el archivo o los archivos de configuración de la aplicación.
En la página de registro de la aplicación, seleccione Certificados y secretos en el panel de navegación para abrir la página donde puede generar secretos y cargar certificados.
En la sección Secretos de cliente, seleccione Nuevo secreto de cliente.
Escriba una descripción, por ejemplo, secreto de aplicación.
Seleccione una de las duraciones disponibles: 6 meses, 12 meses o Personalizado.
Seleccione Agregar. Se muestra el valor generado.
Copie y guarde el valor generado para usarlo en pasos posteriores. Necesita este valor para los archivos de configuración del código. Este valor no volverá a aparecer y no podrá recuperarlo por ningún otro medio. Por lo tanto, asegúrese de guardarlo desde Azure Portal antes de navegar a cualquier otra pantalla o panel.
En la página de registro de la aplicación, seleccione Permisos de API en el panel de navegación para abrir la página, donde puede agregar acceso a las API que necesita la aplicación.
Selecciona Agregar permiso.
Asegúrese de que la pestaña API de Microsoft esté seleccionada.
En la sección API de Microsoft más usadas, seleccione Microsoft Graph.
En la sección Permisos delegados, seleccione GroupMember.Read.All en la lista. Si es necesario, utilice el cuadro de búsqueda. Este permiso es necesario para obtener pertenencias a grupos a través de Graph si se produce el escenario de exceso.
Seleccione el botón para conceder consentimiento de administrador para
GroupMember.Read.All
.Selecciona Agregar permisos.
Creación de grupos de seguridad
Para crear grupos de seguridad, siga estos pasos:
Vaya a Azure Portal y seleccione Microsoft Entra ID.
Seleccione Grupos en el panel de navegación.
En el panel Grupos, seleccione Nuevo grupo y proporcione la siguiente información:
- En Tipo de grupo, seleccione Seguridad.
- En Nombre de grupo, escriba AdminGroup.
- En Descripción del grupo, escriba Grupo de seguridad de administración.
- Agregue los Propietarios de grupos y Miembros de grupo que quiera usar y probar en este ejemplo.
- Seleccione Crear.
En el panel Grupos, seleccione Nuevo grupo y proporcione la siguiente información:
- En Tipo de grupo, seleccione Seguridad.
- En Nombre de grupo, escriba UserGroup.
- En Descripción de grupo, escriba Grupo de seguridad de usuario.
- Agregue los Propietarios de grupos y Miembros de grupo que quiera usar y probar en este ejemplo.
- Seleccione Crear.
Para obtener más información, consulte Administrar grupos de Microsoft Entra y pertenencia a grupos.
Configurar grupos de seguridad
Tiene las siguientes opciones sobre cómo puede configurar aún más la aplicación para recibir la notificación de grupos:
Reciba todos los grupos a los que está asignado el usuario que ha iniciado sesión en un inquilino de Microsoft Entra ID, incluidos grupos anidados. Para obtener más información, consulte la sección Configuración de la aplicación para recibir todos los grupos a los que está asignado el usuario que ha iniciado sesión, incluidos los grupos anidados.
Reciba los valores de notificación de grupos de un conjunto filtrado de grupos con los que su aplicación está programada para trabajar. Para obtener más información, consulte la sección Configuración de la aplicación para recibir los valores de notificación de grupos de un conjunto filtrado de grupos al que se puede asignar un usuario. Esta opción no está disponible en la edición gratuita de Microsoft Entra ID.
Nota:
Para obtener el samAccountName
o On Premises Group Security Identifier
del grupo local, en lugar del identificador de grupo, consulte la sección Requisitos previos para usar atributos de grupo sincronizados desde Active Directory en Configuración de notificaciones de grupo para aplicaciones mediante Microsoft Entra ID.
Configuración de la aplicación para recibir todos los grupos a los que está asignado el usuario que ha iniciado sesión, incluidos los grupos anidados.
Siga estos pasos para configurar la aplicación:
En la página de registro de la aplicación, seleccione Configuración de token en el panel de navegación para abrir la página donde puede configurar los tokens proporcionados por notificaciones emitidos en la aplicación.
Seleccione Agregar notificación de grupos para abrir la pantalla Editar notificación de grupos.
Seleccione Grupos de seguridad o Todos los grupos (incluye las listas de distribución pero no los grupos asignados a la aplicación). La elección de ambas opciones anula el efecto de la opción Grupos de seguridad.
En la sección ID, seleccione ID de grupo. Esta selección hace que Microsoft Entra ID envíe el ID de objeto de los grupos a los que el usuario está asignado en la notificación de grupos del token de ID que su aplicación recibe después de registrar a un usuario.
Configuración de la aplicación para recibir los valores de notificación de grupos de un conjunto filtrado de grupos a los que se puede asignar un usuario
Esta opción es útil cuando se cumplen los siguientes casos:
- La aplicación está interesada en un conjunto seleccionado de grupos a los que podría estar asignado un usuario que inicia sesión.
- La aplicación no está interesada en todos los grupos de seguridad a los que está asignado este usuario en el inquilino.
Esta opción ayuda a su aplicación a evitar el problema de exceso.
Nota:
Esta característica no está disponible en la edición gratuita de Microsoft Entra ID.
Las asignaciones de grupos anidados no están disponibles cuando se usa esta opción.
Para habilitar esta opción en la aplicación, siga estos pasos:
En la página de registro de la aplicación, seleccione Configuración de token en el panel de navegación para abrir la página donde puede configurar los tokens proporcionados por notificaciones emitidos en la aplicación.
Seleccione Agregar notificación de grupos para abrir la pantalla Editar notificación de grupos.
Seleccione Grupos asignados a la aplicación y no seleccione ninguna otra opción. Si elige más opciones, como Grupos de seguridad o Todos los grupos (incluye listas de distribución pero no grupos asignados a la aplicación), estas opciones anulan el efecto de la opción Grupos asignados a la aplicación.
En la sección ID, seleccione ID de grupo. Esta selección hace que Microsoft Entra ID envíe el ID de objeto de los grupos a los que el usuario está asignado en la notificación de grupos del token de ID que su aplicación recibe después de registrar a un usuario.
Si expone una API mediante la opción Exponer una API, también puede elegir la opción ID de grupo en la sección Acceso. Esta selección hace que Microsoft Entra ID envíe el identificador de objeto de los grupos a los que se asigna el usuario en la notificación de grupos del token de acceso emitido a las aplicaciones cliente de la API.
En la página de registro de la aplicación, seleccione Información general en el panel de navegación para abrir la pantalla de información general de la aplicación.
seleccione el hipervínculo con el nombre de la aplicación en Aplicación administrada en directorio local. Este título de campo puede estar truncado, por ejemplo, Aplicación administrada en ... Al seleccionar este vínculo, vaya a la página Información general de la aplicación empresarial asociada a la entidad de servicio de la aplicación en el inquilino donde la creó. Para volver a la página de registro de la aplicación, use el botón Atrás del explorador.
Seleccione Usuarios y grupos en el panel de navegación para abrir la página donde puede asignar usuarios y grupos a la aplicación.
Seleccione Agregar usuario.
Seleccione Usuario y grupos en la pantalla resultante.
Elija los grupos que desea asignar a esta aplicación.
Seleccione Seleccionar para terminar de seleccionar los grupos.
Seleccione Asignar para finalizar el proceso de asignación de grupos.
La aplicación ahora recibe estos grupos seleccionados en la notificación de grupos cuando un usuario que inicia sesión en la aplicación es miembro de uno o varios de estos grupos asignados.
Seleccione Propiedades en el panel de navegación para abrir la página que muestra las propiedades básicas de la aplicación. Establezca la marca ¿Asignación de usuario necesaria? en Sí.
Importante
Cuando se establece ¿Asignación de usuario necesaria? en Sí, Microsoft Entra ID comprueba que solo los usuarios asignados a la aplicación en el panel Usuarios y grupos pueden iniciar sesión en la aplicación. Puede asignar usuarios directamente o asignando grupos de seguridad a los que pertenecen.
Configuración del ejemplo de código para usar el registro de aplicaciones y los grupos de seguridad (java-spring-webapp-groups)
Siga estos pasos para configurar la aplicación:
Nota:
En los pasos siguientes, ClientID
es igual que Application ID
o AppId
.
Abra el proyecto en su IDE.
Abra el archivo src\main\resources\application.yml.
Busque el marcador de posición
Enter_Your_Tenant_ID_Here
y reemplace el valor existente por el Id. de inquilino de Microsoft Entra.Busque el marcador de posición
Enter_Your_Client_ID_Here
y reemplace el valor existente por el identificador de aplicación oclientId
de la aplicaciónjava-spring-webapp-groups
que ha copiado de Azure Portal.Busque el marcador de posición
Enter_Your_Client_Secret_Here
y reemplace el valor existente por el valor que guardó durante la creación dejava-spring-webapp-groups
que copió en Azure Portal.Busque el marcador de posición
Enter_Your_Admin_Group_ID_Here
y reemplace el valor existente por el valorobjectId
de AdminGroup.Busque el marcador de posición
Enter_Your_User_Group_ID_Here
y reemplace el valor existente por el valorobjectId
de UserGroup.Abra el archivo src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java.
Busque el marcador de posición
Enter_Your_Admin_Group_ID_Here
y reemplace el valor existente por el valorobjectId
de AdminGroup.Busque el marcador de posición
Enter_Your_User_Group_ID_Here
y reemplace el valor existente por el valorobjectId
de UserGroup.
Ejecución del ejemplo
En las secciones siguientes se muestra cómo implementar el ejemplo en Azure Container Apps.
Requisitos previos
- Una cuenta de Azure. En caso de no tener ninguna, cree una cuenta gratuita. Necesita el permiso Colaborador o Propietario en la suscripción de Azure para continuar. Para más información, consulte Asignación de roles de Azure mediante Azure Portal.
- LaCLI de Azure.
- Extensión de la CLI de Azure Container Apps, versión
0.3.47
o posterior. Use el comandoaz extension add --name containerapp --upgrade --allow-preview
para instalar la versión más reciente. - Kit de desarrollo de Java, versión 17 o posterior.
- Maven.
Preparar el proyecto de Spring
Siga estos pasos para preparar el proyecto:
Use el siguiente comando de Maven para compilar el proyecto:
mvn clean verify
Ejecute el proyecto de ejemplo localmente mediante el comando siguiente:
mvn spring-boot:run
Configurar
Para iniciar sesión en Azure desde la CLI, ejecute el siguiente comando y siga las indicaciones para completar el proceso de autenticación.
az login
Para asegurarse de que ejecuta la versión más reciente de la CLI, ejecute el comando de actualización.
az upgrade
Luego, instale o actualice la extensión de Azure Container Apps para la CLI.
Si recibe errores sobre los parámetros que faltan al ejecutar comandos az containerapp
en la CLI de Azure, asegúrese de tener instalada la versión más reciente de la extensión de Azure Container Apps.
az extension add --name containerapp --upgrade
Nota:
A partir de mayo de 2024, las extensiones de la CLI de Azure ya no habilitan las características en versión preliminar de forma predeterminada. Para acceder a las características de la versión preliminar de Container Apps, instale la extensión Container Apps con --allow-preview true
.
az extension add --name containerapp --upgrade --allow-preview true
Ahora que la extensión o módulo actualizado está instalado, registre los espacios de nombre Microsoft.App
y Microsoft.OperationalInsights
.
Nota:
Los recursos de Azure Container Apps han migrado desde el espacio de nombres Microsoft.Web
al espacio de nombres Microsoft.App
. Consulte Migración del espacio de nombres de Microsoft.Web a Microsoft.App marzo de 2022 para obtener más detalles.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
Creación del entorno de Azure Container Apps
Ahora que la configuración de la CLI de Azure está completa, puede definir las variables de entorno que se usan en este artículo.
Defina las siguientes variables en el shell de 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"
Cree un grupo de recursos.
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION \
Cree un entorno con un área de trabajo de Log Analytics generada automáticamente.
az containerapp env create \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Muestra el dominio predeterminado del entorno de la aplicación contenedora. Anote este dominio para usarlo en secciones posteriores.
az containerapp env show \
--name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--query properties.defaultDomain
Preparar la aplicación para la implementación
Al implementar la aplicación en Azure Container Apps, la dirección URL de redireccionamiento cambia a la dirección URL de redireccionamiento de la instancia de la aplicación implementada en Azure Container Apps. Siga estos pasos para cambiar esta configuración en el archivo application.yml:
Acceda al archivo src\main\resources\application.yml de la aplicación y cambie el valor de
post-logout-redirect-uri
por el nombre de dominio de la aplicación implementada, tal como se muestra en el ejemplo siguiente. No olvide reemplazar<API_NAME>
y<default-domain-of-container-app-environment>
por los valores reales. Por ejemplo, con el dominio predeterminado para el entorno de Azure Container App del paso anterior yms-identity-api
para el nombre de la aplicación, usaríahttps://ms-identity-api.<default-domain>
para el valorpost-logout-redirect-uri
.post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
Después de guardar este archivo, use el siguiente comando para volver a compilar la aplicación:
mvn clean package
Importante
El archivo application.yml de la aplicación incluye actualmente el valor del secreto de cliente en el parámetro client-secret
. No es recomendable dejar este valor en este archivo. Es posible que también tome algunos riesgos si confirma el archivo en un repositorio de Git. Para obtener el enfoque recomendado, consulte Administración de secretos en Azure Container Apps.
Actualizar el registro de la aplicación de Microsoft Entra ID
Como el URI de redireccionamiento cambia en la aplicación implementada en Azure Container Apps, también debe cambiar el URI de redireccionamiento en el registro de la aplicación de Microsoft Entra ID. Para realizar este cambio, siga estos pasos:
Vaya a la página de Registros de aplicaciones de la plataforma de identidad de Microsoft para desarrolladores.
Use el recuadro de búsqueda para buscar el registro de la aplicación; por ejemplo,
java-servlet-webapp-authentication
.Para abrir el registro de la aplicación, seleccione el nombre.
Seleccione Autenticar desde el menú.
En la sección Web - URIs de redireccionamiento, seleccione Agregar URI.
Rellene el URI de la aplicación, anexando
/login/oauth2/code/
; por ejemplo,https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/
.Seleccione Guardar.
Implementar la aplicación
Implemente el paquete JAR en Azure Container Apps.
Nota:
Si fuera necesario, especifique la versión de JDK en las variables del entorno de compilación Java. Para obtener más información, consulte Compilación de variables de entorno para Java en Azure Container Apps.
Ahora puede implementar el archivo WAR con el comando az containerapp up
de la CLI.
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
Nota:
La versión predeterminada de JDK es 17. Si necesita cambiar la versión de JDK por problemas de compatibilidad con la aplicación, puede usar el argumento --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>
para ajustar el número de versión.
Para ver más variables de entorno de compilación, consulte Compilación de variables de entorno para Java en Azure Container Apps.
Validación de la aplicación
En este ejemplo, el comando containerapp up
incluye el argumento --query properties.configuration.ingress.fqdn
, que devuelve el nombre de dominio completo (FQDN), también conocido como la dirección URL de la aplicación. Siga estos pasos para comprobar los registros de la aplicación para investigar cualquier problema de implementación:
Acceda a la dirección URL de la aplicación final en la página Salida de la sección Implementación.
En el panel de navegación de la página Información general de la instancia de Azure Container Apps, seleccione Registros para comprobar los registros de la aplicación.
Exploración del ejemplo
Siga estos pasos para explorar el ejemplo:
- Observe que el estado de inicio de sesión o de cierre de sesión se muestra en el centro de la pantalla.
- Seleccione el botón contextual en la esquina. Este botón indica Iniciar sesión cuando se ejecuta por primera vez la aplicación. Como alternativa, seleccione los detalles del token, solo administradores o usuarios normales. Dado que estas páginas están protegidas y requieren autenticación, se le redirigirá automáticamente a la página de inicio de sesión.
- En la página siguiente, siga las instrucciones e inicie sesión con una cuenta en el inquilino de Microsoft Entra ID.
- En la pantalla de consentimiento, observe los ámbitos que se solicitan.
- Tras completar correctamente el flujo de inicio de sesión, debe redirigirse a la página principal (que muestra el estado de inicio de sesión) o a una de las otras páginas, en función del botón que desencadene el flujo de inicio de sesión.
- Observe que el botón contextual ahora indica Cerrar sesión y muestra el nombre de usuario.
- Si está en la página principal, seleccione Detalles del token de identificador para ver algunas de las notificaciones descodificadas del token de identificador, incluidos los grupos.
- Seleccione Solo administradores para ver el
/admin_only
. Solo los usuarios que pertenecen al grupo de seguridadAdminGroup
pueden ver esta página. De lo contrario, se muestra un mensaje de error de autorización. - Seleccione Usuarios normales para ver la página
/regular_user
. Solo los usuarios que pertenecen al grupo de seguridadUserGroup
pueden ver esta página. De lo contrario, se muestra un mensaje de error de autorización. - Use el botón de la esquina para cerrar la sesión. La página de estado refleja el nuevo estado.
Sobre el código
En este ejemplo se muestra cómo usar la biblioteca cliente de Spring Boot Starter de Microsoft Entra ID para Java para iniciar sesión de usuarios en el inquilino de Microsoft Entra ID. El ejemplo también usa los iniciadores de spring Oauth2 Client y Spring Web Boot. En el ejemplo se usan notificaciones del token de identificador obtenido de Microsoft Entra ID para mostrar los detalles del usuario que ha iniciado sesión y para restringir el acceso a algunas páginas mediante la notificación de grupos para la autorización.
Contenido
En la tabla siguiente se muestra el contenido de la carpeta del proyecto de ejemplo:
Archivo/carpeta | Descripción |
---|---|
pom.xml | Dependencias de aplicaciones. |
src/main/resources/templates/ | Plantillas de Thymeleaf para la interfaz de usuario. |
src/main/resources/application.yml | Configuración de la biblioteca de inicio de arranque de inicio de Microsoft Entra ID y aplicación. |
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ | Este directorio contiene el punto de entrada, el controlador y las clases de configuración principales de la aplicación. |
.../MsIdentitySpringBootWebappApplication.java | Clase Main. |
.../SampleController.java | Controlador con asignaciones de puntos de conexión. |
.../SecurityConfig.java | Configuración de seguridad: por ejemplo, qué rutas requieren autenticación. |
.../Utilities.java | Clase de utilidad: por ejemplo, filtrar notificaciones de token de identificador. |
CHANGELOG.md | Lista de cambios en la muestra. |
CONTRIBUTING.md | Directrices para contribuir al ejemplo. |
LICENCIA | Licencia del ejemplo. |
Notificaciones de token de ID
Para extraer los detalles del token, la aplicación usa el objeto AuthenticationPrincipal
y OidcUser
de Spring Security en una asignación de solicitudes, como se muestra en el ejemplo siguiente. Consulta el controlador de ejemplo para obtener los detalles completos de cómo esta aplicación usa notificaciones de token de identificador.
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();
}
Procesamiento de una notificación de grupos en el token de identificador
La notificación de grupos del token incluye los nombres de los grupos a los que está asignado el usuario que ha iniciado sesión, como se muestra en el ejemplo siguiente:
{
...
"groups": [
"xyz-id-xyz",
"xyz-id-xyz",]
...
}
Una manera común de acceder a los nombres de grupo se documenta en la sección Notificaciones de token de identificador.
Microsoft Entra ID Boot Starter v3.5 y versiones posteriores analiza automáticamente la notificación de grupos y agrega cada grupo a las Authorities
del usuario que ha iniciado sesión. Esta configuración permite a los desarrolladores usar grupos con anotaciones de condición PrePost
de Spring mediante el método hasAuthority
. Por ejemplo, puede encontrar las siguientes condiciones @PreAuthorize
que se muestran en 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
}
El código siguiente obtiene una lista completa de autoridades para un usuario determinado:
@GetMapping(path = "/some_path")
public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();
}
Vínculos de inicio y cierre de sesión
Para el inicio de sesión, la aplicación realiza una solicitud al punto de conexión de inicio de sesión de Microsoft Entra ID configurado automáticamente por la biblioteca cliente de Spring Boot Starter de Microsoft Entra ID para Java, como se muestra en el ejemplo siguiente:
<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
Para cerrar sesión, la aplicación realiza una solicitud POST al punto de conexión logout
, como se muestra en el ejemplo siguiente:
<form action="#" th:action="@{/logout}" method="post">
<input class="btn btn-warning" type="submit" value="Sign Out" />
</form>
Elementos de la interfaz de usuario dependientes de la autenticación
La aplicación tiene cierta lógica sencilla en las páginas de plantilla de la interfaz de usuario para determinar el contenido que se va a mostrar en función de si el usuario está autenticado, como se muestra en el ejemplo siguiente mediante etiquetas 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>
Protección de rutas con AADWebSecurityConfigurerAdapter
De forma predeterminada, la aplicación protege las páginas Detalles del token de identificador, Solo administradores y Usuarios normales para que solo los usuarios que hayan iniciado sesión puedan acceder a ellas. La aplicación configura estas rutas mediante la propiedad app.protect.authenticated
del archivo application.yml. Para configurar los requisitos específicos de la aplicación, puede ampliar AADWebSecurityConfigurationAdapter
en una de las clases. Para obtener un ejemplo, consulte la clase SecurityConfig de esta aplicación, que se muestra en el código siguiente:
@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.
}
}
Notificación de grupos por encima del límite
Para garantizar que el tamaño del token no supere los límites de tamaño del encabezado HTTP, la plataforma de identidades de Microsoft limita el número de identificadores de objeto que se incluyen en la notificación de grupo.
El límite de exceso es de 150 para los tokens SAML, 200 para los tokens JWT y 6 para las aplicaciones de una sola página. Si un usuario es miembro de más grupos que el límite de exceso, la plataforma de identidades de Microsoft no emite los identificadores de grupo en la notificación de grupos del token. En su lugar, incluye una demanda de uso por encima del límite en el token que indica a la aplicación que consulte la API de Microsoft Graph para recuperar la pertenencia a grupos del usuario.
Microsoft Entra ID Boot Starter v3.5 y versiones posteriores analiza automáticamente la notificación de grupos y agrega cada grupo a las Authorities
del usuario que ha iniciado sesión. El iniciador controla automáticamente el escenario de uso por encima del límite.
Nota:
Le recomendamos encarecidamente que use la característica de filtrado de grupos, si es posible, para evitar que se produzca un uso excesivo de grupos. Para obtener más información, consulte la sección Configuración de la aplicación para recibir los valores de notificación de grupos de un conjunto filtrado de grupos al que se puede asignar un usuario.
Creación del escenario de exceso para las pruebas
Puede usar el archivo BulkCreateGroups.ps1 proporcionado en la carpeta AppCreationScripts para crear un gran número de grupos y asignarles usuarios. Este archivo ayuda a probar escenarios de uso de exceso durante el desarrollo. Recuerde cambiar el objectId
del usuario proporcionado en el script BulkCreateGroups.ps1.
Controlar el exceso requiere una llamada a Microsoft Graph para leer las pertenencias a grupos del usuario que ha iniciado sesión, por lo que la aplicación debe tener los permisos User.Read y GroupMember.Read.All para que la función getMemberObjects se ejecute correctamente.
Importante
Para el escenario de exceso, asegúrese de que ha concedido Admin Consent
para el ámbito de GroupMember.Read.All
de la API de Microsoft Graph tanto para las aplicaciones de cliente como de servicio. Para obtener más información, consulte los pasos de registro de aplicaciones anteriores en este artículo.
Actualización del registro de aplicaciones de Microsoft Entra ID (java-spring-webapp-groups)
Para actualizar el registro de la aplicación web, siga estos pasos:
Vuelva a Azure Portal.
En el panel de navegación izquierdo, seleccione Azure Active Directory y, después, seleccione Registros de aplicaciones (versión preliminar).
En la pantalla resultante, seleccione la aplicación
java-spring-webapp-groups
.En la página de registro de la aplicación, seleccione Autenticación en el menú.
En la sección URI de redirección, actualice las direcciones URL de respuesta para que coincidan con la dirección URL del sitio de la implementación de Azure, por ejemplo,
https://java-spring-webapp-groups.azurewebsites.net/login/oauth2/code/
.
Importante
Si la aplicación usa un almacenamiento en memoria, Azure App Services desactiva el sitio web si está inactivo y se vacían los registros que la aplicación estaba manteniendo. Además, si aumenta el recuento de instancias del sitio web, las solicitudes se distribuyen entre las instancias. Por lo tanto, los registros de las aplicaciones no son los mismos en cada instancia.
Más información
- Documentación de la plataforma de identidad de Microsoft
- Descripción general de la biblioteca de autenticación de Microsoft (MSAL)
- Inicio rápido: Registro de una aplicación en la plataforma de identidad de Microsoft
- Inicio rápido: Configuración de una aplicación cliente para tener acceso a las API web
- Qué son las experiencias de consentimiento de las aplicaciones de Microsoft Entra ID
- Descripción del consentimiento del usuario y del administrador
- Objetos de aplicación y de entidad de servicio de Azure Active Directory
- Nubes nacionales
- Ejemplos de código MSAL
Para obtener más información sobre cómo funcionan los protocolos de OAuth 2.0 en este escenario y otros escenarios, vea Escenarios de autenticación para Microsoft Entra ID.