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


🎯 Nível 1: Fundamentos

Problema 10.1 — Geração e Assinatura de Token JWT com jjwt

Contexto: Geração e Assinatura de Token JWT com jjwt no contexto de Autenticação Stateless com JWT e Filtros Customizados.

Requisitos de Execução:

  1. Criar componente TokenService para emitir token JWT assinado com chave HMAC-SHA256 e tempo de expiração.

Resultado Esperado

Token JWT gerado com claims de usuário e expiração de 2 horas.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_1_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Autenticação Stateless com JWT e Filtros Customizados
🔑 Gabarito de Código & Solução Comentada
// TokenService.java
package com.empresa.api.security;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;

@Service
public class TokenService {
    private final byte[] secret = "super_segredo_spring_boot_3_token_key_2026".getBytes();

    public String gerarToken(String username) {
        return Jwts.builder()
            .subject(username)
            .issuedAt(new Date())
            .expiration(Date.from(Instant.now().plus(2, ChronoUnit.HOURS)))
            .signWith(Keys.hmacShaKeyFor(secret))
            .compact();
    }
}

🔍 Nível 2: Prática

Problema 10.2 — Filtro de Autenticação OncePerRequestFilter

Contexto: Filtro de Autenticação OncePerRequestFilter no contexto de Autenticação Stateless com JWT e Filtros Customizados.

Requisitos de Execução:

  1. Implementar SecurityFilter extends OncePerRequestFilter interceptando header Authorization: Bearer e autenticando no SecurityContextHolder.

Resultado Esperado

Token interceptado pelo filtro e usuário autenticado no SecurityContext.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_2_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Autenticação Stateless com JWT e Filtros Customizados
🔑 Gabarito de Código & Solução Comentada
// SecurityFilter.java
package com.empresa.api.security;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.List;

@Component
public class SecurityFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {
        String authHeader = req.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            var auth = new UsernamePasswordAuthenticationToken("user", null, List.of());
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        chain.doFilter(req, res);
    }
}

⚡ Nível 3: Integração

Problema 10.3 — Endpoint de Autenticação /auth/login com Retorno de Token DTO

Contexto: Endpoint de Autenticação /auth/login com Retorno de Token DTO no contexto de Autenticação Stateless com JWT e Filtros Customizados.

Requisitos de Execução:

  1. Criar controller recebendo credenciais e disparando authenticationManager.authenticate().

Resultado Esperado

Login bem sucedido -> Retorna JWT Token DTO para o cliente.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_3_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Autenticação Stateless com JWT e Filtros Customizados
🔑 Gabarito de Código & Solução Comentada
// AuthController.java
package com.empresa.api.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/auth")
public class AuthController {
    record LoginDTO(String email, String senha) {}
    record TokenResponseDTO(String token, String tipo) {}

    @PostMapping("/login")
    public ResponseEntity<TokenResponseDTO> login(@RequestBody LoginDTO dto) {
        return ResponseEntity.ok(new TokenResponseDTO("jwt_token_exemplo", "Bearer"));
    }
}

🏆 Nível 4: Desafio Corporativo

Problema 10.4 — Validação de Token com Chave Pública RSA (JWKS / OAuth2 Resource Server)

Contexto: Validação de Token com Chave Pública RSA (JWKS / OAuth2 Resource Server) no contexto de Autenticação Stateless com JWT e Filtros Customizados.

Requisitos de Execução:

  1. Configurar Spring Security como OAuth2 Resource Server com http.oauth2ResourceServer(oauth2 -> oauth2.jwt()).

Resultado Esperado

Assinatura de token validada via servidor de autorização OpenID Connect.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_4_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Autenticação Stateless com JWT e Filtros Customizados
🔑 Gabarito de Código & Solução Comentada
// ResourceServerConfig.java
package com.empresa.api.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class ResourceServerConfig {
    @Bean
    public SecurityFilterChain resourceFilterChain(HttpSecurity http) throws Exception {
        return http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()))
            .build();
    }
}