🧩 Exercícios: Autenticação Stateless com JWT e Filtros Customizados
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:
- Criar componente
TokenServicepara 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)
- Salve o arquivo como:
Atividade_10_1_SeuNome - 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:
- Implementar
SecurityFilter extends OncePerRequestFilterinterceptando headerAuthorization: Bearere autenticando noSecurityContextHolder.
Resultado Esperado
Token interceptado pelo filtro e usuário autenticado no SecurityContext.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_10_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_10_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_10_4_SeuNome - 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();
}
}