Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 09.1 — Configuração de SecurityFilterChain com Lambda DSL

Contexto: Configuração de SecurityFilterChain com Lambda DSL no contexto de Spring Security 6 Architecture e SecurityFilterChain.

Requisitos de Execução:

  1. Declarar bean SecurityFilterChain desabilitando CSRF em APIs stateless e liberando /actuator/health.

Resultado Esperado

SecurityFilterChain configurada com Spring Security 6 Lambda DSL.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_1_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Spring Security 6 Architecture e SecurityFilterChain
🔑 Gabarito de Código & Solução Comentada
// SecurityConfig.java
package com.empresa.api.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .csrf(csrf -> csrf.disable())
            .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/v1/auth/**", "/actuator/health").permitAll()
                .anyRequest().authenticated()
            )
            .build();
    }
}

🔍 Nível 2: Prática

Problema 09.2 — Codificação de Senhas com BCryptPasswordEncoder

Contexto: Codificação de Senhas com BCryptPasswordEncoder no contexto de Spring Security 6 Architecture e SecurityFilterChain.

Requisitos de Execução:

  1. Declarar bean PasswordEncoder com 12 rounds de custo computacional.

Resultado Esperado

Hash BCrypt gerado com salt dinâmico e comparado com segurança.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_2_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Spring Security 6 Architecture e SecurityFilterChain
🔑 Gabarito de Código & Solução Comentada
// PasswordEncoderConfig.java
package com.empresa.api.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class PasswordEncoderConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(12);
    }
}

⚡ Nível 3: Integração

Problema 09.3 — Tratamento de Exceções de Segurança (AuthenticationEntryPoint)

Contexto: Tratamento de Exceções de Segurança (AuthenticationEntryPoint) no contexto de Spring Security 6 Architecture e SecurityFilterChain.

Requisitos de Execução:

  1. Customizar AuthenticationEntryPoint e AccessDeniedHandler para retornar JSON de erro em vez de redirecionar para tela de login.

Resultado Esperado

Erro 401 Unauthorized retornado em JSON com mensagem padronizada.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_3_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Spring Security 6 Architecture e SecurityFilterChain
🔑 Gabarito de Código & Solução Comentada
// CustomAuthEntryPoint.java
package com.empresa.api.security;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import java.io.IOException;

@Component
public class CustomAuthEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
        response.setContentType("application/json");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        response.getWriter().write("{\"erro\": \"Não autorizado\"}");
    }
}

🏆 Nível 4: Desafio Corporativo

Problema 09.4 — Autenticação Customizada com AuthenticationProvider

Contexto: Autenticação Customizada com AuthenticationProvider no contexto de Spring Security 6 Architecture e SecurityFilterChain.

Requisitos de Execução:

  1. Implementar AuthenticationProvider customizado integrando autenticação multifator (MFA/2FA).

Resultado Esperado

Provedor de autenticação com validação de token OTP aprovado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_09_4_SeuNome
  2. Envie na tarefa: Atividade Cap 09 - Spring Security 6 Architecture e SecurityFilterChain
🔑 Gabarito de Código & Solução Comentada
// MfaAuthenticationProvider.java
package com.empresa.api.security;

import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component;

@Component
public class MfaAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication auth) throws AuthenticationException {
        return auth; // Validação de segundo fator
    }
    @Override
    public boolean supports(Class<?> auth) { return true; }
}