Skip to content

joaoalbertorsc/session-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 

Repository files navigation

API de Autenticação e Gestão de Sessões em Java ☕

📝 Sobre o Projeto

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.

💡 Principais Conceitos Abordados

  • 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.

🧭 Estado atual vs expectativas

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 username como 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.

🛠️ Tecnologias Utilizadas (versão real do projeto)

  • 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.

🗂️ Estrutura importante do projeto

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
  • repository/
    • UserRepository.java — Interface JPA para User

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.

🚀 Como Executar (curto caminho)

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:run

A 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.

✉️ Endpoints (exemplos reais baseados na implementação atual)

  1. 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."

  1. 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.

  1. 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.

  1. Verificar status da sessão
curl "http://localhost:8080/status?username=alice"

Resposta: 200 OK se ainda logado; 401 se sessão expirada.

⚠️ Limitações e riscos de segurança (LEIA ANTES DE USAR)

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.

🚧 Roadmap / Sugestões de evolução (próximos passos)

  1. Substituir Base64 por BCrypt:

    • Adicionar spring-boot-starter-security ou spring-security-crypto.
    • Utilizar BCryptPasswordEncoder para hash e validação.
  2. Implementar autenticação real com Spring Security:

    • Proteger rotas com filtros.
    • Utilizar AuthenticationManager/ UserDetailsService.
  3. Implementar tokens JWT (opcional):

    • Gerar JWT no login, validar em cada requisição usando Authorization: Bearer .
  4. Remover uso de username como query param para acesso protegido:

    • Usar informações do token/cookie para identificar o usuário autenticado.
  5. Tornar as sessões escaláveis e persistentes:

    • Store em Redis ou banco compartilhado para suportar múltiplas instâncias.
  6. Adicionar testes automatizados (unit e integração) e CI.

  7. (Opcional) Ajustar o pom para Java 17 caso queira compatibilidade mais ampla ou alinhar o README para Java 21.

👨‍💻 Contribuição

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.

👤 Autor

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!

About

Este repositório contém o código-fonte da Session API, um projeto desenvolvido para demonstrar na prática como implementar rotinas de segurança, autenticação e gerenciamento de sessões de usuários em aplicações web e microserviços.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages