Guia do desenvolvedor do Spring Boot Starter para Microsoft Entra

Este artigo se aplica a: ✔️ Versão 4.19.0 ✔️ Versão 5.17.0

Este artigo descreve os recursos e os principais cenários do Spring Boot Starter para Microsoft Entra ID. Este artigo também inclui diretrizes sobre problemas comuns, soluções alternativas e etapas de diagnóstico.

Quando você está criando um aplicativo Web, o gerenciamento de identidade e acesso são partes fundamentais. O Azure oferece um serviço de identidade baseado em nuvem que tem integração profunda com o restante do ecossistema do Azure.

Embora a Segurança do Spring facilite a proteção dos seus aplicativos baseados em Spring, ela não é adaptada para um provedor de identidade específico. O Spring Boot Starter para Microsoft Entra ID permite que você conecte seu aplicativo Web a um locatário do Microsoft Entra e proteja seu servidor de recursos com o ID do Microsoft Entra. Ele usa o protocolo OAuth 2.0 para proteger aplicativos Web e servidores de recursos.

Os seguintes links fornecem acesso ao pacote inicial, à documentação e aos exemplos:

Pré-requisitos

Para seguir as instruções deste artigo, é necessário cumprir os seguintes pré-requisitos:

Importante

É necessário o Spring Boot versão 2.5 ou posterior para concluir as etapas neste artigo.

Principais cenários

Este guia descreve como usar o iniciador do Microsoft Entra nos seguintes cenários:

Aplicativo Web é qualquer aplicativo baseado na Web que permita a um usuário entrar. O servidor de recursos aceita ou nega acessos após validar tokens de acesso.

Acessar um aplicativo Web

Esse cenário usa o fluxo de concessão de código de autorização OAuth 2.0 para permitir que um usuário entre com uma conta Microsoft.

Para usar o iniciador do Microsoft Entra neste cenário, execute as seguintes etapas:

Defina o URI de redirecionamento como <application-base-uri>/login/oauth2/code/. Por exemplo: http://localhost:8080/login/oauth2/code/. Inclua à direita /. Para obter mais informações sobre o URI de redirecionamento, confira Adicionar um URI de redirecionamento no Início rápido: registrar um aplicativo com a plataforma de identidade da Microsoft.

Captura de tela do portal do Azure mostrando a página de autenticação do aplicativo Web com o URI de redirecionamento realçado.

Adicione as dependências a seguir no arquivo pom.xml.

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Observação

Para obter mais informações sobre como gerenciar versões da biblioteca do Spring Cloud Azure usando uma lista de materiais (BOM), consulte a seção Introdução do guia do desenvolvedor do Spring Cloud Azure.

Adicione as propriedades a seguir ao arquivo application.yml. Você pode obter os valores dessas propriedades por meio do registro de aplicativo que criou no portal do Azure, conforme descrito nos pré-requisitos.

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       profile:
         tenant-id: <tenant>
       credential:
         client-id: <your-client-ID>
         client-secret: <your-client-secret>

Observação

Os valores permitidos para tenant-id são: common, organizations, consumers ou a ID do locatário. Para obter mais informações sobre esses valores, consulte a seção Uso do ponto de extremidade incorreto (contas pessoais e de organização) do Error AADSTS50020 – A conta de usuário do provedor de identidade não existe no locatário. Para saber como converter seu aplicativo de locatário único, consulte Converter aplicativo de locatário único em multilocatário no Microsoft Entra ID.

Use a configuração de segurança padrão ou forneça sua própria configuração.

Opção 1: use a configuração padrão.

Com essa opção, você não precisa fazer nada. A classe DefaultAadWebSecurityConfigurerAdapter é configurada automaticamente.

Opção 2: forneça uma configuração autodefinida.

Para fornecer uma configuração, estenda a classe AadWebSecurityConfigurerAdapter e chame super.configure(http) na função configure(HttpSecurity http), conforme mostrado no seguinte exemplo:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {

   /**
    * Add configuration logic as needed.
   */
   @Override
   protected void configure(HttpSecurity http) throws Exception {
       super.configure(http);
       http.authorizeRequests()
           .anyRequest().authenticated();
       // Do some custom configuration.
   }
}

Acessar servidores de recursos por meio de um aplicativo Web

Para usar o iniciador do Microsoft Entra neste cenário, execute as seguintes etapas:

Defina o URI de redirecionamento conforme descrito anteriormente.

Adicione as dependências a seguir no arquivo pom.xml.

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Observação

Para obter mais informações sobre como gerenciar versões da biblioteca do Spring Cloud Azure usando uma lista de materiais (BOM), consulte a seção Introdução do guia do desenvolvedor do Spring Cloud Azure.

Adicione as seguintes propriedades ao arquivo application.yml, conforme descrito anteriormente:

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       profile:
         tenant-id: <tenant>
       credential:
         client-id: <your-client-ID>
         client-secret: <your-client-secret>
       authorization-clients:
         graph:
           scopes: https://graph.microsoft.com/Analytics.Read, email

Observação

Os valores permitidos para tenant-id são: common, organizations, consumers ou a ID do locatário. Para obter mais informações sobre esses valores, consulte a seção Uso do ponto de extremidade incorreto (contas pessoais e de organização) do Error AADSTS50020 – A conta de usuário do provedor de identidade não existe no locatário. Para saber como converter seu aplicativo de locatário único, consulte Converter aplicativo de locatário único em multilocatário no Microsoft Entra ID.

Aqui, graph é o nome do seu OAuth2AuthorizedClient e scopes são os escopos necessários para o consentimento ao fazer logon.

Adicione código ao seu aplicativo semelhante ao seguinte exemplo:

@GetMapping("/graph")
@ResponseBody
public String graph(
   @RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graphClient
) {
   // toJsonString() is just a demo.
   // oAuth2AuthorizedClient contains access_token. We can use this access_token to access the resource server.
   return toJsonString(graphClient);
}

Aqui, graph é a ID do cliente configurada na etapa anterior. OAuth2AuthorizedClient contém o token de acesso, que é usado para acessar o servidor de recursos.

Para obter um exemplo completo que demonstra esse cenário, consulte spring-cloud-azure-starter-active-directory sample: aad-web-application.

Proteger um servidor de recursos/uma API

Esse cenário não dá suporte à entrada, mas protege o servidor validando o token de acesso. Se o token de acesso for válido, o servidor entregará a solicitação.

Para usar o iniciador do Microsoft Entra neste cenário, execute as seguintes etapas:

Adicione as dependências a seguir no arquivo pom.xml.

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

Observação

Para obter mais informações sobre como gerenciar versões da biblioteca do Spring Cloud Azure usando uma lista de materiais (BOM), consulte a seção Introdução do guia do desenvolvedor do Spring Cloud Azure.

Adicione as seguintes propriedades ao arquivo application.yml, conforme descrito anteriormente:

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       credential:
         client-id: <your-client-ID>
       app-id-uri: <your-app-ID-URI>

Você pode usar os valores <your-client-ID> e <your-app-ID-URI> para verificar o token de acesso. Você pode obter o valor <your-app-ID-URI> do portal do Azure, conforme mostrado nas seguintes imagens:

Captura de tela do portal do Azure mostrando o aplicativo Web Expor uma página de API com o URI do ID do Aplicativo realçado.

Use a configuração de segurança padrão ou forneça sua própria configuração.

Opção 1: use a configuração padrão.

Com essa opção, você não precisa fazer nada. A classe DefaultAadResourceServerWebSecurityConfigurerAdapter é configurada automaticamente.

Opção 2: forneça uma configuração autodefinida.

Para fornecer uma configuração, estenda a classe AadResourceServerWebSecurityConfigurerAdapter e chame super.configure(http) na função configure(HttpSecurity http), conforme mostrado no seguinte exemplo:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {

   /**
    * Add configuration logic as needed.
    */
   @Override
   protected void configure(HttpSecurity http) throws Exception {
       super.configure(http);
       http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
   }
}

Para obter um exemplo completo que demonstra esse cenário, consulte spring-cloud-azure-starter-active-directory sample: aad-resource-server.

Acessar outros servidores de recursos por meio de um servidor de recursos

Esse cenário dá suporte para um servidor de recursos visitar outros servidores de recursos.

Para usar o iniciador do Microsoft Entra neste cenário, execute as seguintes etapas:

Adicione as dependências a seguir no arquivo pom.xml.

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Observação

Para obter mais informações sobre como gerenciar versões da biblioteca do Spring Cloud Azure usando uma lista de materiais (BOM), consulte a seção Introdução do guia do desenvolvedor do Spring Cloud Azure.

Adicione as seguintes propriedades ao arquivo application.yml:

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       profile:
         tenant-id: <tenant>
       credential:
         client-id: <web-API-A-client-ID>
         client-secret: <web-API-A-client-secret>
       app-id-uri: <web-API-A-app-ID-URI>
       authorization-clients:
         graph:
           scopes:
              - https://graph.microsoft.com/User.Read

Observação

Os valores permitidos para tenant-id são: common, organizations, consumers ou a ID do locatário. Para obter mais informações sobre esses valores, consulte a seção Uso do ponto de extremidade incorreto (contas pessoais e de organização) do Error AADSTS50020 – A conta de usuário do provedor de identidade não existe no locatário. Para saber como converter seu aplicativo de locatário único, consulte Converter aplicativo de locatário único em multilocatário no Microsoft Entra ID.

Use o atributo @RegisteredOAuth2AuthorizedClient em seu código para acessar o servidor de recursos relacionado, conforme mostrado no seguinte exemplo:

@PreAuthorize("hasAuthority('SCOPE_Obo.Graph.Read')")
@GetMapping("call-graph")
public String callGraph(@RegisteredOAuth2AuthorizedClient("graph") OAuth2AuthorizedClient graph) {
   return callMicrosoftGraphMeEndpoint(graph);
}

Para obter um exemplo completo que demonstra esse cenário, consulte spring-cloud-azure-starter-active-directory sample: aad-resource-server-obo.

Aplicativo Web e servidor de recursos em um aplicativo

Este cenário dá suporte para Acessar um aplicativo Web e Proteger um servidor/API de recursos em um aplicativo.

Para usar aad-starter nesse cenário, siga estas etapas:

Adicione as dependências a seguir no arquivo pom.xml.

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

Observação

Para obter mais informações sobre como gerenciar versões da biblioteca do Spring Cloud Azure usando uma lista de materiais (BOM), consulte a seção Introdução do guia do desenvolvedor do Spring Cloud Azure.

Atualize o arquivo application.yml. Defina a propriedade spring.cloud.azure.active-directory.application-type como web_application_and_resource_server e especifique o tipo de autorização de cada cliente de autorização, conforme mostra o exemplo a seguir.

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       profile:
         tenant-id: <tenant>
       credential:
         client-id: <Web-API-C-client-id>
         client-secret: <Web-API-C-client-secret>
       app-id-uri: <Web-API-C-app-id-url>
       application-type: web_application_and_resource_server  # This is required.
       authorization-clients:
         graph:
           authorizationGrantType: authorization_code  # This is required.
           scopes:
             - https://graph.microsoft.com/User.Read
             - https://graph.microsoft.com/Directory.Read.All

Observação

Os valores permitidos para tenant-id são: common, organizations, consumers ou a ID do locatário. Para obter mais informações sobre esses valores, consulte a seção Uso do ponto de extremidade incorreto (contas pessoais e de organização) do Error AADSTS50020 – A conta de usuário do provedor de identidade não existe no locatário. Para saber como converter seu aplicativo de locatário único, consulte Converter aplicativo de locatário único em multilocatário no Microsoft Entra ID.

Escreva o código Java para configurar várias instâncias de HttpSecurity.

No código de exemplo a seguir, AadWebApplicationAndResourceServerConfig contém duas configurações de segurança, uma para um servidor de recursos e outra para um aplicativo Web. A classe ApiWebSecurityConfigurationAdapter tem uma prioridade alta para configurar o adaptador de segurança do servidor de recursos. A classe HtmlWebSecurityConfigurerAdapter tem uma baixa prioridade para configurar o adaptador de segurança do aplicativo Web.

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadWebApplicationAndResourceServerConfig {

   @Order(1)
   @Configuration
   public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {
       protected void configure(HttpSecurity http) throws Exception {
           super.configure(http);
           // All the paths that match `/api/**`(configurable) work as the esource server. Other paths work as  the web application.
           http.antMatcher("/api/**")
               .authorizeRequests().anyRequest().authenticated();
       }
   }

   @Configuration
   public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {

       @Override
       protected void configure(HttpSecurity http) throws Exception {
           super.configure(http);
           // @formatter:off
           http.authorizeRequests()
                   .antMatchers("/login").permitAll()
                   .anyRequest().authenticated();
           // @formatter:on
       }
   }
}

Tipo de aplicativo

A propriedade spring.cloud.azure.active-directory.application-type é opcional porque o respectivo valor pode ser inferido por dependências. Você precisa definir a propriedade manualmente somente quando o valor web_application_and_resource_server é usado.

Tem dependência: spring-security-oauth2-client Tem dependência: spring-security-oauth2-resource-server Valores válidos de tipo de aplicativo Valor padrão
Sim Não web_application web_application
No Sim resource_server resource_server
Sim Sim web_application,resource_server,
resource_server_with_obo, web_application_and_resource_server
resource_server_with_obo

Propriedades configuráveis

O Iniciador do Spring Boot para Microsoft Entra ID fornece as seguintes propriedades:

Propriedades Descrição
spring.cloud.azure.active-directory.app-id-uri Usado pelo servidor de recursos para validar o público-alvo no token de acesso. O token de acesso é válido somente quando o público-alvo é igual aos valores <your-client-ID> ou <your-app-ID-URI> descritos anteriormente.
spring.cloud.azure.active-directory.authorization-clients Mapa que configura as APIs de recurso que o aplicativo vai visitar. Cada item corresponde a uma API de recurso que o aplicativo vai visitar. No seu código do Spring, cada item corresponde a um objeto OAuth2AuthorizedClient.
spring.cloud.azure.active-directory.authorization-clients.<your-client-name>.scopes Permissões de API de um servidor de recursos que o aplicativo vai adquirir.
spring.cloud.azure.active-directory.authorization-clients.<your-client-name>.authorization-grant-type O tipo do cliente de autorização. Os tipos com suporte são authorization_code (tipo padrão para webapp), on_behalf_of (tipo padrão para resource-server) e client_credentials.
spring.cloud.azure.active-directory.application-type Confira Tipo de aplicativo.
spring.cloud.azure.active-directory.profile.environment.active-directory-endpoint URI de base para o servidor de autorização. O valor padrão é https://login.microsoftonline.com/.
spring.cloud.azure.active-directory.credential.client-id O ID do aplicativo registrado no Microsoft Entra ID.
spring.cloud.azure.active-directory.credential.client-secret Segredo do cliente do aplicativo registrado.
spring.cloud.azure.active-directory.user-group.use-transitive-members Use v1.0/me/transitiveMemberOf para obter grupos se definido como true. Caso contrário, use /v1.0/me/memberOf.
spring.cloud.azure.active-directory.post-logout-redirect-uri URI de redirecionamento para postar a saída.
spring.cloud.azure.active-directory.profile.tenant-id ID do locatário do Azure. Os valores permitidos para tenant-id são: common, organizations, consumers ou a ID do locatário.
spring.cloud.azure.active-directory.user-group.allowed-group-names Grupos de usuários esperados aos quais uma autoridade será concedida se encontrados na resposta da chamada à API do Graph do MemberOf.
spring.cloud.azure.active-directory.user-name-attribute Indica qual declaração será o nome da entidade de segurança.

Os seguintes exemplos mostram como você usa essas propriedades:

Exemplo de propriedade 1: para usar o Azure China 21Vianet em vez do Azure Global, execute a etapa a seguir.

  • Adicione as seguintes propriedades ao arquivo application.yml:

    spring:
       cloud:
         azure:
           active-directory:
             enabled: true
             profile:
               environment:
                 active-directory-endpoint: https://login.partner.microsoftonline.cn
    

Com esse método, você pode usar uma nuvem soberana ou nacional do Azure em vez da nuvem pública do Azure.

Exemplo de propriedade 2: para usar um nome de grupo para proteger algum método em um aplicativo Web, execute as seguintes etapas:

Adicione a seguinte propriedade ao arquivo application.yml:

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       user-group:
         allowed-groups: group1, group2

Use a configuração de segurança padrão ou forneça sua própria configuração.

Opção 1: use a configuração padrão. Com essa opção, você não precisa fazer nada. A classe DefaultAadWebSecurityConfigurerAdapter é configurada automaticamente.

Opção 2: forneça uma configuração autodefinida. Para fornecer uma configuração, estenda a classe AadWebSecurityConfigurerAdapter e chame super.configure(http) na função configure(HttpSecurity http), conforme mostrado no seguinte exemplo:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {

   /**
    * Add configuration logic as needed.
    */
   @Override
   protected void configure(HttpSecurity http) throws Exception {
       super.configure(http);
       http.authorizeRequests()
           .anyRequest().authenticated();
       // Do some custom configuration.
   }
}

Use a anotação @PreAuthorize para proteger o método, conforme mostrado no seguinte exemplo:

@Controller
public class RoleController {
   @GetMapping("group1")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_group1')")
   public String group1() {
       return "group1 message";
   }

   @GetMapping("group2")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_group2')")
   public String group2() {
       return "group2 message";
   }

   @GetMapping("group1Id")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_<group1-id>')")
   public String group1Id() {
       return "group1Id message";
   }

   @GetMapping("group2Id")
   @ResponseBody
   @PreAuthorize("hasRole('ROLE_<group2-id>')")
   public String group2Id() {
       return "group2Id message";
   }
}

Exemplo de propriedade 3: para habilitar o fluxo de credenciais do cliente em um servidor de recursos que visite outros servidores de recursos, use as seguintes etapas:

Adicione a seguinte propriedade ao arquivo application.yml:

spring:
 cloud:
   azure:
     active-directory:
       enabled: true
       authorization-clients:
         webapiC:   # When authorization-grant-type is null, on behalf of flow is used by default
           authorization-grant-type: client_credentials
           scopes:
             - <Web-API-C-app-id-url>/.default

Adicione código ao seu aplicativo semelhante ao seguinte exemplo:

@PreAuthorize("hasAuthority('SCOPE_Obo.WebApiA.ExampleScope')")
@GetMapping("webapiA/webapiC")
public String callClientCredential() {
   String body = webClient
       .get()
       .uri(CUSTOM_LOCAL_READ_ENDPOINT)
       .attributes(clientRegistrationId("webapiC"))
       .retrieve()
       .bodyToMono(String.class)
       .block();
   LOGGER.info("Response from Client Credential: {}", body);
   return "client Credential response " + (null != body ? "success." : "failed.");
}

Recursos avançados

Suporte ao controle de acesso por token de ID em um aplicativo Web

O iniciador dá suporte à criação de GrantedAuthority por meio de uma declaração roles de token de ID para permitir o uso do token de ID para autorização em um aplicativo Web. Você pode usar o recurso appRoles do Microsoft Entra ID para criar uma declaração roles e implementar o controle de acesso.

Observação

A declaração roles gerada de appRoles é decorada com o prefixo APPROLE_.

Ao usar appRoles como uma declaração roles, evite configurar um atributo de grupo como roles ao mesmo tempo. Caso contrário, o atributo de grupo substituirá a declaração para conter informações de grupo em vez de appRoles. Você deve evitar a seguinte configuração em seu manifesto:

"optionalClaims": {
    "idtoken": [{
        "name": "groups",
        "additionalProperties": ["emit_as_roles"]
    }]
}

Para dar suporte ao controle de acesso por token de ID em um aplicativo Web, use as seguintes etapas:

Adicione funções de aplicativo ao seu aplicativo e atribua-nas a usuários ou grupos. Para obter mais informações, confira Como fazer: adicionar funções de aplicativo ao seu aplicativo e recebê-las no token.

Adicione a seguinte configuração appRoles ao manifesto do seu aplicativo:

 "appRoles": [
   {
     "allowedMemberTypes": [
       "User"
     ],
     "displayName": "Admin",
     "id": "2fa848d0-8054-4e11-8c73-7af5f1171001",
     "isEnabled": true,
     "description": "Full admin access",
     "value": "Admin"
    }
 ]

Adicione código ao seu aplicativo semelhante ao seguinte exemplo:

@GetMapping("Admin")
@ResponseBody
@PreAuthorize("hasAuthority('APPROLE_Admin')")
public String Admin() {
   return "Admin message";
}

Solução de problemas

Habilitar o log do cliente

Os SDKs do Azure para Java oferecem uma história de log consistente para ajudar a solucionar problemas e resolver erros de aplicativo. Os logs produzidos capturam o fluxo de um aplicativo antes de alcançar o terminal, ajudando a localizar o problema raiz. Confira o wiki de registro em log para obter diretrizes sobre como habilitar esse recurso.

Habilitar o registro em log no Spring

O Spring permite que todos os sistemas de registrar em log compatíveis definam níveis de agente no ambiente do Spring (por exemplo, em application.properties) usando logging.level.<logger-name>=<level> nos casos em que o nível é TRACE, DEBUG, INFO, WARN, ERROR, FATAL ou OFF. Você pode configurar o agente raiz usando logging.level.root.

O seguinte exemplo mostra as possíveis configurações para registrar em log no arquivo application.properties:

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

Para obter mais informações sobre a configuração para registrar em log no Spring, confira Registro em log na documentação do Spring.

Próximas etapas

Para saber mais sobre o Spring e o Azure, continue no Spring no Centro de Documentação do Azure.