Este repositório é um exemplo prático chamado Session API que demonstra conceitos básicos de autenticação e gerenciamento de sessões em uma aplicação Java com Spring Boot. O objetivo é educacional: mostrar fluxos simples de registro, login e verificação de sessão para facilitar o aprendizado dos mecanismos envolvidos. Não é uma referência para produção sem melhorias de segurança.
- Autenticação e autorização em nível conceitual.
- Persistência de usuários com JPA (entidade User).
- Gerenciamento simples de sessão em memória (criação e verificação de sessão por usuário).
- Boas práticas conceituais (hash de senhas, proteção de rotas) — observação: nem todas estão implementadas nesta versão demo.
O README original descreve várias técnicas e bibliotecas (por exemplo Spring Security, JWT, BCrypt) como se já estivessem implementadas. Na versão atual do código-base, há diferenças importantes que você deve conhecer:
- A aplicação NÃO utiliza Spring Security nem gera tokens JWT.
- As senhas são armazenadas codificadas em Base64 (reversível) — isto é apenas para demonstração e NÃO é seguro.
- O gerenciamento de sessão é feito em memória em um Map<username, timestamp> com duração fixa de 60 segundos.
- Os endpoints de verificação de sessão aceitam o parâmetro
usernamecomo query param para validar sessões (ou seja, não há autenticação via header/cookie/token). - Não existe suporte a um mecanismo de sessão distribuída (ex.: Redis) nesta versão.
Por isso: o repositório é adequado para aprendizado e experimentação, mas não deve ser usado em produção sem as melhorias de segurança listadas abaixo.
- Java 21 (conforme configuração do
pom.xml) - Spring Boot 3.2.5
- Dependências principais (no
pom.xml):- spring-boot-starter-web
- spring-boot-starter-data-jpa
- com.h2database:h2 (runtime)
Nota: Spring Security, bibliotecas de hashing (BCrypt) e JWT não estão adicionadas neste commit. Se você encontrar referências no README original, elas se referem a temas sugeridos para evolução ou objetivos do aprendizado — não à implementação atual.
src/main/java/org/ebac/sessiondemo/
- SessionDemoApplication.java — Classe principal do Spring Boot
- controller/
- AuthController.java — Endpoints: /register, /login, /protected, /status
- service/
- UserService.java — Registro e autenticação; usa Base64 para codificar a senha
- SessionService.java — Armazena sessões em memória (Map) e valida TTL = 60s
- entity/
- User.java — Entidade JPA
users
- User.java — Entidade JPA
- repository/
- UserRepository.java — Interface JPA para
User
- UserRepository.java — Interface JPA para
Como isso se encaixa: as requisições chegam ao AuthController, que usa UserService para registrar/autenticar usuários e SessionService para criar/verificar sessões em memória. A persistência de usuários usa JPA com H2 em tempo de execução.
Requisitos mínimos:
- Java 21 instalado (variável JAVA_HOME configurada).
- Maven instalado (ou adicione o Maven Wrapper ao repositório).
Passos:
git clone https://github.com/joaoalbertorsc/session-api.git
cd session-api
mvn clean package
mvn spring-boot:runA aplicação sobe por padrão na porta 8080.
Observação: o repositório atual não inclui o Maven Wrapper (mvnw / mvnw.cmd). Se você preferir usar o wrapper, adicione-o ao projeto.
- Registrar usuário
curl -X POST http://localhost:8080/register \
-H 'Content-Type: application/json' \
-d '{"username":"alice","password":"senha123"}'Resposta esperada: 200 OK - "Usuário cadastrado."
- Login (cria sessão em memória)
curl -X POST http://localhost:8080/login \
-H 'Content-Type: application/json' \
-d '{"username":"alice","password":"senha123"}'Resposta esperada: 200 OK - "Login realizado. Sessão válida por 60 segundos." ou 401 se credenciais inválidas.
- Acessar rota protegida (implementação atual exige query param username)
curl "http://localhost:8080/protected?username=alice"Resposta: 200 OK se sessão válida; 401 se não autenticado/expirado.
- Verificar status da sessão
curl "http://localhost:8080/status?username=alice"Resposta: 200 OK se ainda logado; 401 se sessão expirada.
Esta implementação tem propósito didático. Não use em produção sem aplicar as melhorias a seguir:
- Senhas codificadas com Base64: inseguro e reversível. Use hashing adaptativo (BCrypt ou Argon2) com salt.
- Ausência de Spring Security: não há proteção real das rotas nem gerenciamento de autenticação baseado em filtros/chain.
- Sessões em memória por username: voláteis (perda em restart), não escaláveis, e podem ser facilmente forjadas se o username for fornecido externamente.
- Transmissão/armazenamento de credenciais: sempre use HTTPS em produção.
-
Substituir Base64 por BCrypt:
- Adicionar
spring-boot-starter-securityouspring-security-crypto. - Utilizar
BCryptPasswordEncoderpara hash e validação.
- Adicionar
-
Implementar autenticação real com Spring Security:
- Proteger rotas com filtros.
- Utilizar AuthenticationManager/ UserDetailsService.
-
Implementar tokens JWT (opcional):
- Gerar JWT no login, validar em cada requisição usando Authorization: Bearer .
-
Remover uso de
usernamecomo query param para acesso protegido:- Usar informações do token/cookie para identificar o usuário autenticado.
-
Tornar as sessões escaláveis e persistentes:
- Store em Redis ou banco compartilhado para suportar múltiplas instâncias.
-
Adicionar testes automatizados (unit e integração) e CI.
-
(Opcional) Ajustar o pom para Java 17 caso queira compatibilidade mais ampla ou alinhar o README para Java 21.
Contribuições são bem-vindas. Para mudanças significativas (p.ex. adicionar Spring Security ou trocar o hashing), abra uma issue descrevendo a proposta ou envie um PR com testes e documentação atualizada.
João Alberto – Engenheiro de Software
Se este projeto te ajudou a entender conceitos básicos de segurança e sessão em APIs Java, deixe uma ⭐ no repositório!