Article image
Mateus Filpo
Mateus Filpo09/06/2024 17:53
Compartilhe

4 Passos para Adicionar uma Autenticação Básica a Sua API REST com Spring Framework

  • #Java

Introdução

Provavelmente, se programa em Java, você já desenvolveu uma API REST usando Java com Spring, mas será que você configurou a segurança de quem pode acessar os seus dados? Ou um usuário comum pode acessar os dados sensíveis da sua aplicação?

Para se proteger disso, neste artigo, mostrarei a você em 4 passos como adicionar uma segurança básica a sua API usando o Spring Security.

Antes de por a mão no código:

O que é o Spring Security?

Spring Security é um módulo do Spring Framework que permite você proteger suas aplicação. Ele fornece a você estruturas de autenticação e autorização para proteger sua API REST. Neste artigo, iremos ver como implementar uma autenticação básica.

Terminologia:

Autenticação: É o processo de identificar quem está tentando acessar um recurso. Ex.: Pedir para o usuário realizar um login.

Autorização: Verifica se o usuário identificado pode ou não realizar uma determinada ação. Ex.: Com o usuário já identificado, verificar se ele pode acessar uma página específica.

Agora que você já tem essas definições, vamos começar a criar o nosso projeto.

1º Passo: Criação do Projeto

Para este artigo, iremos criar um projeto para exemplificar o uso do Spring Security. Recomendo usar o site Spring Initializr para facilitar a configuração inicial do projeto.

Abaixo estão as opções que devem ser selecionadas(Você também pode ver a imagem):

  • Maven
  • Spring Boot 3.3.0
  • Java
  • Jar
  • Versão do Java 21
  • Adicione a dependência do Spring Web

image

*** Não adicione ainda a dependência do Spring Security

2º Passo: Abra o projeto na sua IDE

Eu irei usar o IntelliJ IDEA, mas você pode escolher a de sua preferência.

3º Passo: Criar uma estrutura básica para poder visualizar o Spring Security em ação

3.1 Crie um novo pacote, chamado controller, na pasta raiz do projeto.

image

3.2 Crie uma classe (dentro desta pasta controller) chamada ExemploController

image

3.3 Use o seguinte código:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExemploController {

  @GetMapping("/publico")
  public String rotaPublica() {
      return "<h1>Rota Pública</h1>" +
             "<h2>Você é livre para olhar esta página 👍<h2>" ;
  }

  @GetMapping("/privado")
  public String rotaPrivada() {
      return "<h1>Rota Privada</h1>" +
             "<p>Apenas pessoas autorizadas podem acessar esses dados! 🔒</p>" +
             "<p>Aqui estão algumas informações sensíveis:</p>" +
             "User: João da Silva<br>" +
             "Password: Senhasecreta123@<br>" +
             "CPF: 000.000.000-00<br>" +
             "Saldo Bancário: R$10.000.000,00<br>";
  }
} 

Este código cria um controlador REST(@RestController) e dois endpoints GET que retornam um HTML específico para cada, um simulando uma página pública e outro simulando uma página privada com dados sensíveis

3.4 Rode o projeto e acesse os endpoints

Você verá que é possível acessar as duas rotas sem nenhuma verificação.

/publico

image

/privado

image

4º Adicionar o Spring Security ao projeto

4.1 adicionar ao pom.xml a dependência do Spring Security

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

image

Só de adicionar esta dependência ao projeto, o Spring Security já habilita a autenticação básica.

Rode o projeto novamente e tente acessar os endpoints. Você dará de cara com essa tela:

image

Basta logar na tela de login que você conseguirá visualizar o conteúdo dos endpoints.

O username padrão é "user" e a senha é gerada no console como msotra a imagem abaixo:

image

4.2 Criar um pacote , chamado config, na pasta raiz

image

4.3 Criar uma classe (dentro da pasta config) chamada SecurityConfig

image

4.4 Adicionar o código abaixo na classe SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  SecurityFilterChain SecurityFilterChain(HttpSecurity http) throws Exception {
      return http
              .authorizeHttpRequests(
                      authorizeConfig -> {
                          authorizeConfig.requestMatchers("/publico").permitAll();
                          authorizeConfig.anyRequest().authenticated();
                      }
              )
              .formLogin(Customizer.withDefaults())
              .build();
  }
}

A anotação @EnableWebSecurity habilita a segurança web no projeto;

O método securityFilterChain() usa a classe HttpSecurity para configurar uma cadeia de filtros para definir as regras de segurança;

Dentro do bloco lambda:

authorizeConfig.requestMatchers("/publico").permitAll() : permite que todos os usuários possam acessar a rota (/publico) sem precisar se autentificar;

authorizeConfig.anyRequest().authenticated() : faz com que qualquer outra rota sem ser a '/publico' precise de autenticação;

formLogin(Customizer.withDefaults()) : ativa a autenticação baseada em formulário com uma configuração padrão.

Agora, ao tentar acessar o endpoint '/publico' você conseguirá acessar sem nenhum problema, mas ao tentar acessar o '/privado' será requerido que você realize um login de acesso. Lembrando que o username padrão é "user" e a senha é gerada no console da aplicação

Pronto

Conseguimos implementar uma autenticação básica com o Spring Security. Você aprendeu a adicionar o Spring Security ao projeto e configurar regras de segurança básicas que permitem acessos à algumas rotas e proíbem outras.

Agora, com esta base de conhecimento você pode procurar estudar mais sobre:

  • JWT (JSON Web Token)
  • OAuth2
  • Autenticação baseada em tokens
  • Autenticação de dois fatores(2FA)

Referências

Documentação do Spring Security: https://docs.spring.io/spring-security/reference/index.html

Curso da DIO: Adicionando Segurança a uma API REST Com Spring Security

Vídeo: Aulão: Proteja o acesso aos seus serviços web com o Spring Security 6!

Compartilhe
Comentários (1)
Bruno Bandeira
Bruno Bandeira - 01/09/2024 16:34

Aqui você lançou a braba. Muito bom, cara