📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Matriz de 20 Capítulos de Aplicações Full Stack. Recomendado revisar antes de iniciar a execução.
v1.0 — Continuação enterprise da solução de inventário com autenticação stateless via tokens JWT, controle granular de acessos por papel (RBAC), histórico auditado e relatórios gerenciais.
Trilha de Especialização Pedagógica — Série Gestão de Estoque (Projeto 2 de 2)
- Gestão de Estoque 01: Spring Boot 3 & SPA de Controle
- Gestão de Estoque 02 (este): Segurança JWT, RBAC (Admin vs Estoquista), Auditoria & Relatórios
🎓 Nível Profissional Simulado: Engenheiro Back-end Pleno (Java & Spring Security). O isolamento de privilégios de almoxarifado é uma exigência de compliance contábil e auditoria (SOX). Dominar filtros de segurança interceptores (
OncePerRequestFilter), emissão criptográfica de tokens JWT com claims de roles e autorização declarativa nos métodos (@PreAuthorize) capacita o desenvolvedor a construir sistemas enterprise invioláveis.
O projeto adota a convenção padronizada de subpastas por camada e tecnologia <camada>-<tecnologia>:
catalogo_projetos/fullstack_estoque_02_spring_auth/
├── api-spring/ # Backend enterprise em Java 21 e Spring Boot 3
│ ├── src/
│ │ ├── main/java/br/com/estoque/
│ │ │ ├── config/ # Filtros de segurança e SecurityFilterChain
│ │ │ ├── controller/ # Endpoints de autenticação, relatórios e estoque
│ │ │ ├── dto/ # LoginRequest, JwtResponse, MovimentacaoDTO
│ │ │ ├── model/ # Entidades Usuario, Role, MovimentacaoEstoque
│ │ │ ├── repository/ # Repositórios com queries de auditoria
│ │ │ ├── security/ # JwtService, UserDetailsService e hash Bcrypt
│ │ │ └── service/ # Regras de movimentação auditada e exportação
│ │ └── main/resources/
│ │ ├── application.yml # Configurações de segredos JWT e datasource
│ │ └── data.sql # Seed com usuários padrão (admin e operador)
│ ├── Dockerfile # Dockerfile multi-stage com OpenJDK 21
│ ├── docker-compose.yml # Banco PostgreSQL e container da aplicação
│ └── pom.xml # Dependências jjwt, spring-boot-starter-security
├── assets/ # Diagramas vetoriais SVG autorais
└── modulo00.md a modulo04.md # Cadernos conceituais de implementação passo a passo
ROLE_ADMIN ou ROLE_ESTOQUISTA)./api/auth/login deve validar as credenciais fornecidas contra o banco criptografado com BCrypt e emitir token JWT assinado digitalmente.roles).JwtAuthenticationFilter deve validar o cabeçalho Authorization: Bearer <token> em todas as requisições privadas populando o SecurityContextHolder.movimentacoes_estoque.SessionCreationPolicy.STATELESS), permitindo escalabilidade horizontal elástica.ROLE_ADMIN.flowchart LR
subgraph Atores
Estoquista["👤 Estoquista"]
Admin["🔑 Gerente / Admin"]
end
subgraph "Sistema de Gestão de Estoque v2 (Auth & RBAC)"
UC01["UC01: Autenticar via JWT"]
UC02["UC02: Registrar Entrada/Saída com Auditoria"]
UC03["UC03: Gerenciar Usuários e Perfis"]
UC04["UC04: Emitir Relatório de Auditoria"]
UC05["UC05: Exportar Relatório de Itens Críticos"]
end
Estoquista --> UC01
Estoquista --> UC02
Admin --> UC01
Admin --> UC02
Admin --> UC03
Admin --> UC04
Admin --> UC05
| ID Requisito | História de Usuário | Caso de Uso | Camada de Segurança (api-spring) |
Camada de Serviço & Controller | Status |
|---|---|---|---|---|---|
| RF-GE01 | US-GE01 | UC01 | AuthController.java |
JwtService.java |
✅ Coberto |
| RF-GE02 | US-GE01 | UC01 | JwtService.java |
UserDetailsServiceImpl.java |
✅ Coberto |
| RF-GE03 | US-GE01 / US-GE02 | UC01 | JwtAuthenticationFilter.java |
SecurityConfig.java |
✅ Coberto |
| RF-GE04 | US-GE03 | UC02 | MovimentacaoRepository.java |
MovimentacaoService.java |
✅ Coberto |
| RF-GE05 | US-GE04 / US-GE05 | UC04 / UC05 | @PreAuthorize("hasRole('ADMIN')") |
RelatorioController.java |
✅ Coberto |
api-spring)cd catalogo_projetos/fullstack_estoque_02_spring_auth/api-spring
# Execução em modo desenvolvimento com banco em memória
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev
http://localhost:8080/h2-consolehttp://localhost:8080/swagger-ui.html# 1. Obter Token JWT como ADMIN
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"password123"}'
# 2. Consultar Relatório com Token
curl -X GET http://localhost:8080/api/relatorios/criticos \
-H "Authorization: Bearer <SEU_TOKEN_AQUI>"
| Checkpoint | Procedimento de Verificação | Critério de Aceite | Status |
|---|---|---|---|
| CP-01 | Disparar POST /api/auth/login com credenciais válidas. |
Retorno HTTP 200 contendo o token JWT assinado e roles do usuário. | PASS ✅ |
| CP-02 | Acessar endpoint protegido /api/relatorios/criticos sem token. |
Retorno HTTP 401 Unauthorized imediato pelo Spring Security. | PASS ✅ |
| CP-03 | Acessar /api/relatorios/criticos autenticado como operador comum. |
Retorno HTTP 403 Forbidden respeitando a anotação @PreAuthorize. |
PASS ✅ |
| CP-04 | Registrar saída de produto via endpoint auditado. | Registro persistido na tabela movimentacoes_estoque com autor vinculado. |
PASS ✅ |
| CP-05 | Executar suíte de testes ./mvnw test. |
Todos os testes de segurança e contratos executam com BUILD SUCCESS. |
PASS ✅ |