Este repositório contém um módulo de segurança plug-and-play para projetos Spring Boot 3+, com autenticação baseada em:
- Login com email e senha (autenticação local)
- Login com Google (OAuth2 + OIDC)
- Geração e validação de JWT usando a stack moderna do Spring Security 6 (
JwtEncoder/JwtDecoder)
A ideia é ser um módulo reutilizável: copie a pasta de segurança para outro projeto, ajuste o User/UserService e você já tem um sistema de autenticação pronto.
- 🔑 Autenticação com email e senha usando
AuthenticationManager - 🌐 Autenticação com Google OAuth2 + OIDC
- 🧾 Geração de JWT com:
sub(subject) = email/usernameid(id do usuário)scope(roles/authorities)iat(data de emissão)exp(data de expiração)
- 🔒 Validação do token JWT com
JwtDecoder - ✂ Módulo desacoplado, fácil de integrar em qualquer API REST
- ✅ Compatível com Spring Boot 3.x e Spring Security 6.x
Pacote base de segurança (exemplo):
src/main/java/com/example/demo/security/
├── SecurityConfig.java
├── jwt/
│ ├── JwtConfig.java
│ └── JwtService.java
├── oauthgoogle/
│ ├── GoogleAuthService.java
│ └── GoogleAuthServiceImpl.java
└── dto/
└── AuthResponseDto.java
Os nomes de pacotes podem ser ajustados conforme a estrutura do seu projeto.
- Java 17+
- Spring Boot 3+
- Spring Security 6
- Spring Security OAuth2 Client (login com Google)
- JWT (Json Web Token) com
NimbusJwtEncodereNimbusJwtDecoder
Uso da abordagem moderna do Spring Security:
JwtEncoderpara gerar tokensJwtDecoderpara validar tokens- Algoritmo de assinatura HMAC SHA-256 (HS256)
- Segredo configurado via
application.propertiesou variáveis de ambiente
Exemplo de payload gerado:
{
"sub": "usuario@example.com",
"id": 3,
"scope": "ROLE_USER",
"iat": 1716499200,
"exp": 1716502800
}- O cliente envia email e senha para o endpoint de login
- O
AuthenticationManagerautentica as credenciais - O sistema carrega o usuário (
User) e extraiide roles - O
JwtServicegera um JWT com as claims principais - O backend retorna um DTO com
id,emailejwt
Exemplo de requisição:
POST /auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "123456"
}Resposta:
{
"id": 3,
"email": "user@example.com",
"jwt": "eyJhbGciOiJIUzI1NiJ9..."
}- O usuário clica em "Login com Google" no frontend
- O Google autentica o usuário e redireciona de volta para a aplicação
- O Spring Security converte o retorno em um
OidcUserautenticado - O
GoogleAuthServiceImpl:- cria ou localiza o usuário no banco (via
UserService) - gera um JWT com o mesmo padrão do login local
- cria ou localiza o usuário no banco (via
- O backend retorna para o frontend um DTO contendo
id,emailejwt
Este módulo utiliza configurações externas para segredos e credenciais do Google. A recomendação é usar variáveis de ambiente:
# JWT
security.jwt.secret=${JWT_SECRET}
security.jwt.expiration-seconds=3600
# Google OAuth2
spring.security.oauth2.client.registration.google.client-id=${GOOGLE_CLIENT_ID}
spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_CLIENT_SECRET}
spring.security.oauth2.client.registration.google.scope=openid,profile,email
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
# Provider do Google
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.user-info-uri=https://openidconnect.googleapis.com/v1/userinfo
spring.security.oauth2.client.provider.google.user-name-attribute=subArquivos como application-dev.properties (com segredos reais) devem ser ignorados via .gitignore.
Para reutilizar este módulo em outro projeto Spring Boot:
- Copie a pasta
security/(e subpacotes) para o novo projeto - Ajuste os pacotes (por exemplo, de
com.example.demoparacom.seuprojeto) - Integre com suas entidades de usuário — adapte
User,UserServicee repositórios para as entidades reais - Configure o
application.propertiesdo novo projeto comsecurity.jwt.secret,security.jwt.expiration-secondse credenciais do Google OAuth2 (se desejar login com Google) - Proteja as rotas desejadas na
SecurityConfig:- liberar
/auth/logine endpoints públicos - exigir autenticação nas demais rotas
- adicionar regras de autorização baseadas em roles/authorities
- liberar
Após a integração, o projeto passa a aceitar:
- Login local + retorno de JWT
- Login Google + retorno de JWT
- Uso de JWT em rotas protegidas via header
Authorization: Bearer <token>
- Nunca commitar valores reais de
security.jwt.secretouGOOGLE_CLIENT_SECRET - Utilizar variáveis de ambiente ou arquivos locais ignorados pelo Git
- Configurar tempo de expiração adequado em
security.jwt.expiration-seconds - Usar segredos longos e aleatórios em produção
- Opcionalmente, adicionar:
- refresh tokens
- rotação de chaves JWT (
kid) - logs e monitoramento de tentativas de login
- Login local: funcional
- Login com Google: funcional
- Geração de JWT: funcional
- Validação de JWT: funcional
- Estrutura pronta para ser reutilizada como módulo de segurança em outros projetos
Fernando Prado Desenvolvedor Backend Java / Spring Boot Focado em criar módulos reutilizáveis, APIs bem estruturadas e projetos de portfólio próximos da realidade de produção.
- 💼 LinkedIn: fernando-prado21
- 🐙 GitHub: FernandoPPrado