Compartir vía


Protección de aplicaciones de Java Spring Boot con el identificador de Microsoft Entra

En este artículo se muestra una aplicación web de Java Spring Boot que inicia sesión de los usuarios en el inquilino de Id. de Microsoft Entra mediante la biblioteca cliente de Spring Boot Starter de Microsoft Entra ID para Java. Usa el protocolo OpenID Connect.

En el diagrama siguiente se muestra la topología de la aplicación:

Diagrama que muestra la topología de la aplicación.

La aplicación cliente usa la biblioteca cliente de Spring Boot Starter id. de Microsoft Entra para Java para iniciar sesión un usuario y obtener un token de identificador de Microsoft Entra ID. El token de identificador demuestra que el usuario se autentica con el identificador de Microsoft Entra y permite al usuario acceder a rutas protegidas.

Requisitos previos

Recomendaciones

  • Cierta familiaridad con Spring Framework
  • Cierta familiaridad con el terminal Linux/OSX o Windows PowerShell
  • 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.

Clonar o descargar el 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/1-Authentication/sign-in

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 limitaciones de longitud de ruta de acceso en Windows, se recomienda clonar en un directorio cerca de la raíz de la unidad.

Registro de las aplicaciones de ejemplo con el inquilino de Microsoft Entra ID

Hay un proyecto en este ejemplo. En las secciones siguientes se muestra cómo registrar la aplicación mediante Azure Portal.

Elija el inquilino de Microsoft Entra ID donde desea crear las aplicaciones.

Para elegir el inquilino, siga estos pasos:

  1. Inicie sesión en Azure Portal.

  2. Si la cuenta está presente en más de un inquilino de Microsoft Entra ID, seleccione el perfil en la esquina de Azure Portal y, a continuación, seleccione Cambiar directorio para cambiar la sesión al inquilino de Microsoft Entra ID deseado.

Registro de la aplicación (java-spring-webapp-auth)

Para registrar la aplicación, siga estos pasos:

  1. Vaya a Azure Portal y seleccione Microsoft Entra ID.

  2. Seleccione Registros de aplicaciones en el panel de navegación y, a continuación, seleccione Nuevo registro.

  3. En la página Registrar una aplicación que aparece, escriba la siguiente información de registro de aplicación:

    • En la sección Nombre , escriba un nombre de aplicación significativo para mostrar a los usuarios de la aplicación; por ejemplo, java-spring-webapp-auth.
    • En Tipos de cuenta admitidos, seleccione Solo las cuentas de este directorio organizativo.
    • En la sección URI de redirección (opcional), seleccione Web en el cuadro combinado y escriba el siguiente URI de redirección: http://localhost:8080/login/oauth2/code/.
  4. Seleccione Registrar para crear la aplicación.

  5. En la página de registro de la aplicación, busque y copie el valor de id. de aplicación (cliente) para usarlo más adelante. Este valor se usa en el archivo o archivos de configuración de la aplicación.

  6. 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.

  7. En la sección Secretos de cliente, seleccione Nuevo secreto de cliente.

  8. Escriba una descripción, por ejemplo, secreto de aplicación.

  9. Seleccione una de las duraciones disponibles: En 1 año, En 2 años o Nunca expira.

  10. Seleccione Agregar. Se muestra el valor generado.

  11. 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 se muestra de nuevo y no se puede recuperar por ningún otro medio. Por lo tanto, asegúrese de guardarlo desde Azure Portal antes de navegar a cualquier otra pantalla o panel.


Configuración de la aplicación (java-spring-webapp-auth) para usar el registro de la aplicación

Siga estos pasos para configurar la aplicación:

Nota:

En los pasos siguientes, ClientID es igual Application ID que o AppId.

  1. Abra el proyecto en el IDE.

  2. Abra el archivo src\main\resources\application.yml .

  3. Busque el marcador Enter_Your_Tenant_ID_Here de posición y reemplace el valor existente por el identificador de inquilino de Microsoft Entra.

  4. Busque el marcador Enter_Your_Client_ID_Here de posición y reemplace el valor existente por el identificador de aplicación o clientId de la java-spring-webapp-auth aplicación copiada de Azure Portal.

  5. Busque el marcador Enter_Your_Client_Secret_Here de posición y reemplace el valor existente por el valor que guardó durante la creación de java-spring-webapp-auth copiado desde Azure Portal.

Ejecución del ejemplo

En las secciones siguientes se muestra cómo implementar el ejemplo en Azure Spring Apps.

Requisitos previos

Preparación del proyecto spring

Siga estos pasos para preparar el proyecto:

  1. Use el siguiente comando de Maven para compilar el proyecto:

    mvn clean package
    
  2. Ejecute el proyecto de ejemplo localmente mediante el comando siguiente:

    mvn spring-boot:run
    

Configuración del complemento Maven

Ejecute el siguiente comando en la raíz del proyecto para configurar la aplicación mediante el complemento Maven para Azure Spring Apps:

mvn com.microsoft.azure:azure-spring-apps-maven-plugin:1.19.0:config

En la lista siguiente se describen las interacciones del comando:

  • Inicio de sesión de OAuth2: debe autorizar el inicio de sesión a Azure en función del protocolo OAuth2.
  • Seleccionar suscripción: seleccione el número de lista de suscripciones donde desea crear la instancia de Azure Spring Apps, que tiene como valor predeterminado la primera suscripción de la lista. Si desea usar el número predeterminado, presione Entrar.
  • Escriba el nombre de Azure Spring Apps: escriba el nombre de la instancia de Spring Apps que desea crear. Si desea usar el nombre predeterminado, presione Entrar.
  • Escriba el nombre del grupo de recursos: escriba el nombre del grupo de recursos en el que desea crear la instancia de Spring Apps. Si desea usar el nombre predeterminado, presione Entrar.
  • Sku: seleccione la SKU que desea usar para la instancia de Spring Apps. Si desea usar el número predeterminado, presione Entrar.
  • Escriba el nombre de la aplicación (demostración): Proporcione un nombre de aplicación. Si desea usar el identificador de artefacto del proyecto predeterminado, presione Entrar.
  • Entornos de ejecución: seleccione el entorno de ejecución que desea usar para la instancia de Spring Apps. En este caso, debe usar el número predeterminado, por lo que presione Entrar.
  • ¿Exponer el acceso público para esta aplicación (boot-for-azure)?: Presione y.
  • Confirmar para guardar todas las configuraciones anteriores: presione y. Si presiona n, la configuración no se guarda en el archivo .pom .

En el ejemplo siguiente se muestra la salida del proceso de implementación:

Summary of properties:
Subscription id   : 12345678-1234-1234-1234-123456789101
Resource group name : rg-ms-identity-spring-boot-webapp
Azure Spring Apps name : cluster-ms-identity-spring-boot-webapp
Runtime Java version : Java 11
Region            : eastus
Sku               : Standard
App name          : ms-identity-spring-boot-webapp
Public access     : true
Instance count/max replicas : 1
CPU count         : 1
Memory size(GB)   : 2
Confirm to save all the above configurations (Y/n):
[INFO] Configurations are saved to: /home/user/ms-identity-msal-java-samples/4-spring-web-app/1-Authentication/sign-in/pom.    xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:57 min
[INFO] Finished at: 2024-02-14T13:50:44Z
[INFO] ------------------------------------------------------------------------

Después de confirmar las opciones, el complemento agrega el elemento de complemento y la configuración necesarios al archivo pom.xml del proyecto para configurar la aplicación para que se ejecute en Azure Spring Apps.

La parte pertinente del archivo pom.xml debe ser similar al ejemplo siguiente:

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-spring-apps-maven-plugin</artifactId>
    <version>1.19.0</version>
    <configuration>
        <subscriptionId>12345678-1234-1234-1234-123456789101</subscriptionId>
        <resourceGroup>rg-ms-identity-spring-boot-webapp</resourceGroup>
        <clusterName>cluster-ms-identity-spring-boot-webapp</clusterName>
        <region>eastus</region>
        <sku>Standard</sku>
        <appName>ms-identity-spring-boot-webapp</appName>
        <isPublic>true</isPublic>
        <deployment>
            <cpu>1</cpu>
            <memoryInGB>2</memoryInGB>
            <instanceCount>1</instanceCount>
            <runtimeVersion>Java 11</runtimeVersion>
            <resources>
                <resource>
                    <directory>${project.basedir}/target</directory>
                    <includes>
                        <include>*.jar</include>
                    </includes>
                </resource>
            </resources>
        </deployment>
    </configuration>
</plugin>

Puede modificar las configuraciones de Azure Spring Apps directamente en el archivo pom.xml . Algunas configuraciones comunes se enumeran en la tabla siguiente:

Propiedad Obligatorio Descripción
subscriptionId false Identificador de la suscripción.
resourceGroup true El grupo de recursos de Azure para la instancia de Azure Spring Apps.
clusterName true Nombre del clúster de Azure Spring Apps. En caso de que use una suscripción y un grupo de recursos que ya tengan implementada una instancia de Azure Spring Apps, también puede usar este clúster existente para realizar la implementación.
appName true Nombre de la aplicación en Azure Spring Apps.
region false Región en la que se va a hospedar la instancia de Azure Spring Apps. El valor predeterminado es eastus. Para ver las regiones válidas, consulte Regiones admitidas.
sku false Plan de tarifa de la instancia de Azure Spring Apps. El valor predeterminado es Basic, que solo es adecuado para entornos de desarrollo y pruebas.
runtime false Configuración del entorno en runtime. Para obtener más información, consulte Detalles de configuración.
deployment false Configuración de implementación. Para obtener más información, consulte Detalles de configuración.

Para obtener la lista completa de configuraciones, consulte la documentación de referencia del complemento. Todos los complementos de Azure Maven comparten un conjunto común de configuraciones. Para estas configuraciones, consulte Configuraciones comunes. Para conocer las configuraciones específicas de Azure Spring Apps, consulte Azure Spring Apps: Detalles de configuración.

Asegúrese de guardar los clusterName valores y appName para su uso posterior.

Preparación de la aplicación para la implementación

Al implementar la aplicación en Azure Spring Apps, la dirección URL de redireccionamiento cambia a la dirección URL de redireccionamiento de la instancia de aplicación implementada en Azure Spring Apps. Siga estos pasos para cambiar esta configuración en el archivo application.yml :

  1. Vaya 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, como se muestra en el ejemplo siguiente. Por ejemplo, si eligió cluster-ms-identity-spring-boot-webapp para la instancia de Azure Spring Apps en el paso anterior y ms-identity-spring-boot-webapp para el nombre de la aplicación, ahora debe usar https://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.io para el post-logout-redirect-uri valor .

    post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
    
  2. Después de guardar este archivo, use el siguiente comando para volver a generar la aplicación:

    mvn clean package
    

Importante

El archivo application.yml de la aplicación contiene actualmente el valor del secreto de cliente en el client-secret parámetro . No es recomendable mantener este valor en este archivo. Es posible que también se esté arriesgando si lo confirma en un repositorio de Git.

Como paso de seguridad adicional, puede almacenar este valor en Azure Key Vault y cargar el secreto de Key Vault para que esté disponible en la aplicación.

Actualización del registro de la aplicación microsoft Entra ID

Dado que el URI de redirección cambia a la aplicación implementada en Azure Spring Apps, también debe cambiar el URI de redirección en el registro de la aplicación de Id. de Microsoft Entra. Para realizar este cambio, siga estos pasos:

  1. Vaya a la página de Registros de aplicaciones de la plataforma de identidad de Microsoft para desarrolladores.

  2. Use el cuadro de búsqueda para buscar el registro de la aplicación; por ejemplo, java-servlet-webapp-authentication.

  3. Para abrir el registro de la aplicación, seleccione su nombre.

  4. Seleccione Autenticar desde el menú.

  5. En la sección URI de redirección web - , seleccione Agregar URI.

  6. Rellene el URI de la aplicación, anexando /login/oauth2/code/ , por ejemplo, https://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/.

  7. Seleccione Guardar.

Implementar la aplicación

Use el siguiente comando para implementar la aplicación:

mvn azure-spring-apps:deploy

En la lista siguiente se describe la interacción del comando:

  • Inicio de sesión de OAuth2: debe autorizar el inicio de sesión a Azure en función del protocolo OAuth2.

Una vez ejecutado el comando, puede ver en los siguientes mensajes de registro que la implementación se ha realizado correctamente:

[INFO] Deployment(default) is successfully created
[INFO] Starting Spring App after deploying artifacts...
[INFO] Deployment Status: Running
[INFO]   InstanceName:demo-default-x-xxxxxxxxxx-xxxxx  Status:Running Reason:null       DiscoverStatus:UNREGISTERED
[INFO]   InstanceName:demo-default-x-xxxxxxxxx-xxxxx  Status:Terminating Reason:null       DiscoverStatus:UNREGISTERED
[INFO] Getting public url of app(demo)...
[INFO] Application url: https://<your-Azure-Spring-Apps-instance-name>-demo.azuremicroservices.io

Validación de la aplicación

Una vez finalizada la implementación, acceda a la aplicación con la dirección URL de la aplicación de salida. Siga estos pasos para comprobar los registros de la aplicación para investigar cualquier problema de implementación:

  1. Acceda a la dirección URL de la aplicación de salida desde la página Salidas de la sección Implementación .

  2. En el panel de navegación de la página Información general de la instancia de Azure Spring Apps, seleccione Registros para comprobar los registros de la aplicación.

Exploración del ejemplo

Siga estos pasos para explorar el ejemplo:

  1. Observe que el estado de inicio de sesión o de cierre de sesión se muestra en el centro de la pantalla.
  2. Seleccione el botón contextual en la esquina. Este botón lee Iniciar sesión cuando se ejecuta por primera vez la aplicación. También puede seleccionar los detalles del token. Dado que esta página está protegida y requiere autenticación, se le redirigirá automáticamente a la página de inicio de sesión.
  3. En la página siguiente, siga las instrucciones e inicie sesión con una cuenta en el inquilino de Microsoft Entra ID.
  4. En la pantalla de consentimiento, observe los ámbitos que se solicitan.
  5. Después de 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 la página de detalles del token, en función del botón que desencadenó el flujo de inicio de sesión.
  6. Observe que el botón contextual ahora indica Cerrar sesión y muestra el nombre de usuario.
  7. Si está en la página principal, seleccione Id. Token Details (Detalles del token de identificador) para ver algunas de las notificaciones descodificadas del token de identificador.
  8. 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 Id. de Microsoft Entra para Java para iniciar sesión de los usuarios en el inquilino de Microsoft Entra ID. El ejemplo también usa los inicios 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.

Contenido

En la tabla siguiente se muestra el contenido de la carpeta del proyecto de ejemplo:

Archivo/carpeta Descripción
pom.xml Dependencias de la aplicación.
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 id. de inicio de microsoft Entra 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 principal.
.../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 el ejemplo.
CONTRIBUTING.md Directrices para contribuir al ejemplo.
LICENCIA Licencia del ejemplo.

Notificaciones de token de identificador

Para extraer los detalles del token, la aplicación usa spring Security y OidcUser el AuthenticationPrincipal objeto 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();
}

Para el inicio de sesión, la aplicación realiza una solicitud al punto de conexión de inicio de sesión de Id. de Microsoft Entra 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 logout punto de conexión, 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 la página Detalles del token de identificador para que solo los usuarios que hayan iniciado sesión puedan acceder a ella. La aplicación configura estas rutas mediante la app.protect.authenticated propiedad del archivo application.yml . Para configurar los requisitos específicos de la aplicación, aplique el AadWebApplicationHttpSecurityConfigurer#aadWebApplication método a la HttpSecurity instancia. Para obtener un ejemplo, consulte la clase SecurityConfig de esta aplicación, que se muestra en el código siguiente:

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig  {
    
    @Value("${app.protect.authenticated}")
    private String[] allowedOrigins;
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
            .and()
            .authorizeHttpRequests(auth -> auth
                .requestMatchers(allowedOrigins).authenticated()
                .anyRequest().permitAll()
                );
        // @formatter:on
        return http.build();
    }

    @Bean
    @RequestScope
    public ServletUriComponentsBuilder urlBuilder() {
        return ServletUriComponentsBuilder.fromCurrentRequest();
    }    
}

Información adicional

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.