Partilhar via


Proteja aplicativos Java Spring Boot usando o Microsoft Entra ID

Este artigo demonstra um aplicativo Web Java Spring Boot que entra em usuários em seu locatário do Microsoft Entra ID usando a biblioteca de cliente Microsoft Entra ID Spring Boot Starter para Java. Ele usa o protocolo OpenID Connect.

O diagrama a seguir mostra a topologia do aplicativo:

Diagrama que mostra a topologia do aplicativo.

O aplicativo cliente usa a biblioteca de cliente Microsoft Entra ID Spring Boot Starter para Java para entrar em um usuário e obter um token de ID do Microsoft Entra ID. O token de ID prova que o usuário está autenticado com o ID do Microsoft Entra e permite que o usuário acesse rotas protegidas.

Pré-requisitos

Recomendações

  • Alguma familiaridade com o Quadro da primavera
  • Alguma familiaridade com o terminal Linux/OSX ou Windows PowerShell
  • jwt.ms para inspecionar seus tokens.
  • Fiddler para monitorizar a sua atividade de rede e resolução de problemas.
  • Siga o Blog do Microsoft Entra ID para ficar atualizado com os últimos desenvolvimentos.

Configurar o exemplo

As seções a seguir mostram como configurar o aplicativo de exemplo.

Clone ou faça download do repositório de exemplo

Para clonar o exemplo, abra uma janela Bash e use o seguinte 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, navegue até o repositório ms-identity-msal-java-samples , faça o download como um arquivo .zip e extraia-o para o disco rígido.

Importante

Para evitar limitações de comprimento de caminho no Windows, recomendamos a clonagem em um diretório próximo à raiz da unidade.

Registre os aplicativos de exemplo com seu locatário do Microsoft Entra ID

Há um projeto neste exemplo. As seções a seguir mostram como registrar o aplicativo usando o portal do Azure.

Escolha o locatário do Microsoft Entra ID onde você deseja criar seus aplicativos

Para escolher seu locatário, use as seguintes etapas:

  1. Inicie sessão no portal do Azure.

  2. Se sua conta estiver presente em mais de um locatário do Microsoft Entra ID, selecione seu perfil no canto do portal do Azure e selecione Alternar diretório para alterar sua sessão para o locatário desejado do Microsoft Entra ID.

Registrar o aplicativo (java-spring-webapp-auth)

Para registrar o aplicativo, use as seguintes etapas:

  1. Navegue até o portal do Azure e selecione Microsoft Entra ID.

  2. Selecione Registos de Aplicações no painel de navegação e, em seguida, selecione Novo registo.

  3. Na página Registrar um aplicativo que aparece, insira as seguintes informações de registro do aplicativo:

    • Na seção Nome, insira um nome de aplicativo significativo para exibição aos usuários do aplicativo - por exemplo, java-spring-webapp-auth.
    • Em Tipos de conta suportados, selecione Contas somente neste diretório organizacional.
    • Na seção Redirecionar URI (opcional), selecione Web na caixa de combinação e digite o seguinte URI de redirecionamento: http://localhost:8080/login/oauth2/code/.
  4. Selecione Registar para criar a aplicação.

  5. Na página de registro do aplicativo, localize e copie o valor da ID do aplicativo (cliente) para usar mais tarde. Você usa esse valor no(s) arquivo(s) de configuração do seu aplicativo.

  6. Na página de registo da aplicação, selecione Certificados & segredos no painel de navegação para abrir a página onde pode gerar segredos e carregar certificados.

  7. Na seção Segredos do cliente, selecione Novo segredo do cliente.

  8. Digite uma descrição - por exemplo, segredo do aplicativo.

  9. Selecione uma das durações disponíveis: Em 1 ano, Em 2 anos ou Nunca expira.

  10. Selecione Adicionar. O valor gerado é exibido.

  11. Copie e salve o valor gerado para uso em etapas posteriores. Você precisa desse valor para os arquivos de configuração do seu código. Esse valor não é exibido novamente e você não pode recuperá-lo por nenhum outro meio. Portanto, certifique-se de salvá-lo do portal do Azure antes de navegar para qualquer outra tela ou painel.


Configure o aplicativo (java-spring-webapp-auth) para usar o registro do aplicativo

Use as seguintes etapas para configurar o aplicativo:

Nota

Nas etapas a seguir, ClientID é o mesmo que Application ID ou AppId.

  1. Abra o projeto no seu IDE.

  2. Abra o arquivo src\main\resources\application.yml .

  3. Localize o espaço reservado Enter_Your_Tenant_ID_Here e substitua o valor existente pelo ID de locatário do Microsoft Entra.

  4. Localize o espaço reservado Enter_Your_Client_ID_Here e substitua o valor existente pela ID do aplicativo ou clientId do java-spring-webapp-auth aplicativo copiado do portal do Azure.

  5. Localize o espaço reservado Enter_Your_Client_Secret_Here e substitua o valor existente pelo valor que você salvou durante a criação do java-spring-webapp-auth copiado do portal do Azure.

Executar o exemplo

As seções a seguir mostram como implantar o exemplo no Azure Spring Apps.

Pré-requisitos

Preparar o projeto primavera

Use as seguintes etapas para preparar o projeto:

  1. Use o seguinte comando Maven para criar o projeto:

    mvn clean package
    
  2. Execute o projeto de exemplo localmente usando o seguinte comando:

    mvn spring-boot:run
    

Configurar o plug-in do Maven

Execute o seguinte comando na raiz do projeto para configurar o aplicativo usando o plug-in Maven para Azure Spring Apps:

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

A lista a seguir descreve as interações de comando:

  • Login OAuth2: você precisa autorizar a entrada no Azure com base no protocolo OAuth2.
  • Selecione a assinatura: selecione o número da lista de assinaturas onde você deseja criar sua instância do Azure Spring Apps, que assume como padrão a primeira assinatura da lista. Se pretender utilizar o número predefinido, prima Enter.
  • Insira o nome do Azure Spring Apps: insira o nome da instância do spring apps que você deseja criar. Se pretender utilizar o nome predefinido, prima Enter.
  • Insira o nome do grupo de recursos: insira o nome do grupo de recursos no qual você deseja criar sua instância de aplicativos de primavera. Se pretender utilizar o nome predefinido, prima Enter.
  • Skus: Selecione a SKU que você deseja usar para sua instância de aplicativos de primavera. Se pretender utilizar o número predefinido, prima Enter.
  • Insira o nome do aplicativo (demonstração): forneça um nome de aplicativo. Se você quiser usar a ID de artefato de projeto padrão, pressione Enter.
  • Tempos de execução: selecione o tempo de execução que você deseja usar para sua instância de aplicativos de primavera. Neste caso, você deve usar o número padrão, então pressione Enter.
  • Exponha o acesso público para este aplicativo (boot-for-azure): pressione y.
  • Confirme para salvar todas as configurações acima: Pressione y. Se você pressionar n, a configuração não será salva no arquivo .pom .

O exemplo a seguir mostra a saída do processo de implantação:

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] ------------------------------------------------------------------------

Depois de confirmar suas escolhas, o plug-in adiciona o elemento e as configurações de plug-in necessários ao arquivo de pom.xml do seu projeto para configurar seu aplicativo para ser executado no Azure Spring Apps.

A parte relevante do arquivo pom.xml deve ser semelhante ao exemplo a seguir:

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

Você pode modificar as configurações do Azure Spring Apps diretamente em seu arquivo de pom.xml . Algumas configurações comuns estão listadas na tabela a seguir:

Property Necessário Description
subscriptionId false O ID da subscrição.
resourceGroup verdadeiro O grupo de recursos do Azure para sua instância do Azure Spring Apps.
clusterName verdadeiro O nome do cluster do Azure Spring Apps. Caso esteja usando uma assinatura e um grupo de recursos que já tenham uma instância do Azure Spring Apps implantada, você também pode usar esse cluster existente para implantar.
appName verdadeiro O nome do seu aplicativo no Azure Spring Apps.
region false A região na qual hospedar sua instância do Azure Spring Apps. O valor predefinido é eastus. Para regiões válidas, consulte Regiões suportadas.
sku false A camada de preços para sua instância do Azure Spring Apps. O valor padrão é Basic, que é adequado apenas para ambientes de desenvolvimento e teste.
runtime false A configuração do ambiente de tempo de execução. Para obter mais informações, consulte Detalhes de configuração.
deployment false A configuração de implantação. Para obter mais informações, consulte Detalhes de configuração.

Para obter a lista completa de configurações, consulte a documentação de referência do plugin. Todos os plug-ins do Azure Maven compartilham um conjunto comum de configurações. Para essas configurações, consulte Configurações comuns. Para configurações específicas do Azure Spring Apps, consulte Azure Spring Apps: Detalhes de configuração.

Certifique-se de salvar os clusterName valores e appName para uso posterior.

Preparar o aplicativo para implantação

Quando você implanta seu aplicativo no Azure Spring Apps, sua URL de redirecionamento muda para a URL de redirecionamento da instância do aplicativo implantado no Azure Spring Apps. Use as seguintes etapas para alterar essas configurações no arquivo application.yml :

  1. Navegue até o arquivo src\main\resources\application.yml do seu aplicativo e altere o valor de para o nome de domínio do post-logout-redirect-uri aplicativo implantado, conforme mostrado no exemplo a seguir. Por exemplo, se você escolheu cluster-ms-identity-spring-boot-webapp para sua instância do Azure Spring Apps na etapa anterior e ms-identity-spring-boot-webapp para o nome do aplicativo, agora você deve usar https://cluster-ms-identity-spring-boot-webapp-ms-identity-spring-boot-webapp.azuremicroservices.io para o post-logout-redirect-uri valor.

    post-logout-redirect-uri: https://<cluster-name>-<app-name>.azuremicroservices.io
    
  2. Depois de salvar esse arquivo, use o seguinte comando para reconstruir seu aplicativo:

    mvn clean package
    

Importante

O arquivo application.yml do aplicativo atualmente contém o valor do segredo do cliente no client-secret parâmetro. Não é uma boa prática manter esse valor neste arquivo. Você também pode estar correndo um risco se confirmá-lo em um repositório Git.

Como uma etapa de segurança extra, você pode armazenar esse valor no Cofre da Chave do Azure e carregar o segredo do Cofre da Chave para disponibilizá-lo em seu aplicativo.

Atualizar o registo da aplicação Microsoft Entra ID

Como o URI de redirecionamento é alterado para seu aplicativo implantado no Azure Spring Apps, você também precisa alterar o URI de redirecionamento no registro do aplicativo Microsoft Entra ID. Use as seguintes etapas para fazer essa alteração:

  1. Navegue até a página Registros de aplicativos da plataforma de identidade da Microsoft para desenvolvedores.

  2. Use a caixa de pesquisa para pesquisar o registro do seu aplicativo - por exemplo, java-servlet-webapp-authentication.

  3. Abra o registro do aplicativo selecionando seu nome.

  4. Selecione Autenticação a partir do menu.

  5. Na seção URIs de redirecionamento da Web - , selecione Adicionar URI.

  6. Preencha o URI do seu aplicativo, anexando /login/oauth2/code/ - por exemplo, https://<cluster-name>-<app-name>.azuremicroservices.io/login/oauth2/code/.

  7. Selecione Guardar.

Implementar a aplicação

Use o seguinte comando para implantar o aplicativo:

mvn azure-spring-apps:deploy

A lista a seguir descreve a interação de comando:

  • Login OAuth2: você precisa autorizar a entrada no Azure com base no protocolo OAuth2.

Depois que o comando for executado, você poderá ver nas seguintes mensagens de log que a implantação foi bem-sucedida:

[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

Validar a aplicação

Após a conclusão da implantação, acesse o aplicativo com a URL do aplicativo de saída. Use as seguintes etapas para verificar os logs do aplicativo para investigar qualquer problema de implantação:

  1. Acesse a URL do aplicativo de saída na página Saídas da seção Implantação .

  2. No painel de navegação da página Visão geral da instância do Azure Spring Apps, selecione Logs para verificar os logs do aplicativo.

Explorar o exemplo

Use as seguintes etapas para explorar o exemplo:

  1. Observe o status de entrada ou saída exibido no centro da tela.
  2. Selecione o botão sensível ao contexto no canto. Este botão lê Iniciar sessão quando executa a aplicação pela primeira vez. Como alternativa, selecione os detalhes do token. Como esta página é protegida e requer autenticação, você é automaticamente redirecionado para a página de entrada.
  3. Na página seguinte, siga as instruções e entre com uma conta no locatário do Microsoft Entra ID.
  4. Na tela de consentimento, observe os escopos que estão sendo solicitados.
  5. Após a conclusão bem-sucedida do fluxo de entrada, você deve ser redirecionado para a página inicial - que mostra o status de entrada - ou para a página de detalhes do token, dependendo de qual botão acionou seu fluxo de entrada.
  6. Observe que o botão sensível ao contexto agora diz Sair e exibe seu nome de usuário.
  7. Se você estiver na página inicial, selecione Detalhes do token de ID para ver algumas das declarações decodificadas do token de ID.
  8. Use o botão no canto para sair. A página de status reflete o novo estado.

Sobre o código

Este exemplo demonstra como usar a biblioteca de cliente Microsoft Entra ID Spring Boot Starter para Java para entrar usuários em seu locatário do Microsoft Entra ID. O exemplo também faz uso dos iniciadores de inicialização do Spring Oauth2 Client e do Spring Web. O exemplo usa declarações do token de ID obtido do ID do Microsoft Entra para exibir os detalhes do usuário conectado.

Conteúdos

A tabela a seguir mostra o conteúdo da pasta de projeto de exemplo:

Ficheiro/pasta Description
pom.xml Dependências de aplicativos.
src/main/recursos/modelos/ Modelos Thymeleaf para UI.
src/principal/recursos/application.yml Configuração da biblioteca de inicialização do aplicativo e do Microsoft Entra ID.
src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ Este diretório contém o ponto de entrada principal do aplicativo, controlador e classes de configuração.
.../MsIdentitySpringBootWebappApplication.java Classe principal.
.../SampleController.java Controlador com mapeamentos de pontos finais.
.../SecurityConfig.java Configuração de segurança - por exemplo, quais rotas exigem autenticação.
.../Utilities.java Classe de utilitário - por exemplo, declarações de token de ID de filtro.
CHANGELOG.md Lista de alterações à amostra.
CONTRIBUTING.md Orientações para contribuir para a amostra.
LICENÇA A licença para a amostra.

Declarações de token de ID

Para extrair detalhes do token, o aplicativo usa o AuthenticationPrincipal objeto e OidcUser o objeto do Spring Security em um mapeamento de solicitação, conforme mostrado no exemplo a seguir. Consulte o Controlador de exemplo para obter os detalhes completos de como este aplicativo usa as declarações de token de ID.

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 entrar, o aplicativo faz uma solicitação ao ponto de extremidade de entrada do Microsoft Entra ID configurado automaticamente pela biblioteca de cliente Microsoft Entra ID Spring Boot Starter para Java, conforme mostrado no exemplo a seguir:

<a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>

Para sair, o aplicativo faz uma solicitação POST para o logout ponto de extremidade, conforme mostrado no exemplo a seguir:

<form action="#" th:action="@{/logout}" method="post">
  <input class="btn btn-warning" type="submit" value="Sign Out" />
</form>

Elementos da interface do usuário dependentes de autenticação

O aplicativo tem alguma lógica simples nas páginas de modelo da interface do usuário para determinar o conteúdo a ser exibido com base na autenticação do usuário, conforme mostrado no exemplo a seguir usando as tags 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>

Proteja rotas com AADWebSecurityConfigurerAdapter

Por padrão, o aplicativo protege a página Detalhes do token de ID para que apenas usuários conectados possam acessá-la. O aplicativo configura essas rotas usando a app.protect.authenticated propriedade do arquivo application.yml. Para configurar os requisitos específicos do seu aplicativo, aplique o AadWebApplicationHttpSecurityConfigurer#aadWebApplication método à HttpSecurity instância. Para obter um exemplo, consulte a classe SecurityConfig deste aplicativo, mostrada no código a seguir:

@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();
    }    
}

Mais informações

Para obter mais informações sobre como os protocolos OAuth 2.0 funcionam neste cenário e em outros cenários, consulte Cenários de autenticação para o Microsoft Entra ID.