Pular para conteúdo

Aula 13 - Autenticação com Spring Security 🔐

Nesta aula, vamos proteger nossa API contra acesso não autorizado usando o Spring Security, o módulo de segurança oficial do ecossistema Spring.

😊 O que é o Spring Security?

Spring Security é o framework responsável por autenticação (quem é você?) e autorização (o que você pode fazer?) em aplicações Spring Boot.

📊 Cadeia de Filtros de Segurança

graph LR
    Req[Requisição] --> F1[Filtro de Autenticação]
    F1 --> F2[Filtro de Autorização]
    F2 --> Controller[Controller]
    F1 -- Falha --> E1[401 Unauthorized]
    F2 -- Falha --> E2[403 Forbidden]

🧠 Configurando a Segurança Básica

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/produtos/publico").permitAll()
                .anyRequest().authenticated()
            );
        return http.build();
    }
}

🧠 Armazenamento Seguro de Senhas

Important

Nunca guarde senhas em texto puro. O Spring Security fornece o BCryptPasswordEncoder, que aplica hash com salt automaticamente.

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

// Ao cadastrar:
String senhaCifrada = passwordEncoder.encode(senhaDigitada);

// Ao logar:
boolean senhaCorreta = passwordEncoder.matches(senhaDigitada, senhaCifrada);

🧠 401 x 403: A Diferença Importa

Código Significado
401 Unauthorized "Não sei quem você é" (não autenticado)
403 Forbidden "Sei quem você é, mas você não tem permissão"

📝 Exercícios Progressivos

  1. Básico: Qual a diferença entre autenticação e autorização?
  2. Básico: Por que nunca devemos guardar senhas em texto puro?
  3. Intermediário: O que faz o BCryptPasswordEncoder?
  4. Intermediário: Qual a diferença prática entre um erro 401 e um erro 403?
  5. Desafio: Configure uma rota /admin/** para exigir uma role específica (ADMIN) usando hasRole().

🚀 Mini-projeto: Adicione o Spring Security ao projeto, configure o BCryptPasswordEncoder, e proteja o endpoint POST /produtos para exigir autenticação.