Uma aplicação de e-commerce desenvolvida em Spring Boot com implementação de servidor de autorização OAuth2, autenticação customizada com password grant type e configuração de segurança abrangente.
- Servidor de Autorização OAuth2: Implementação customizada com suporte a tokens JWT
- Password Grant Customizado: Implementação personalizada do OAuth2 password grant type
- Configuração de Segurança: Setup de segurança completo com suporte a CORS
- Tratamento de Exceções: Handler global de exceções com respostas de erro customizadas
- Autenticação JWT: Tokens JWT auto-contidos com claims customizadas
- Autorização Baseada em Funções: Gerenciamento de autoridades e escopos de usuários
- Java 17+
- Spring Boot 3.x
- Spring Security OAuth2 Authorization Server
- Spring Data JPA
- JWT (JSON Web Tokens)
- Criptografia BCrypt
- Lombok
- Maven
- MySQL
- Docker & Docker Compose
- Java 17 ou superior
- Maven 3.6+
- Docker e Docker Compose
- MySQL (via Docker)
Crie um arquivo application.properties com as seguintes configurações:
# Configuração do Banco de Dados (MySQL)
spring.datasource.url=jdbc:mysql://localhost:3306/dscommerce
spring.datasource.username=dscommerce
spring.datasource.password=dscommerce123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Configuração JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
# Configuração de Segurança
security.client-id=dscommerce-client
security.client-secret=dscommerce-secret
security.jwt.duration=86400
# Configuração CORS
cors.origins=http://localhost:3000,http://localhost:4200,http://localhost:8081- Implementação customizada do password grant type
- Geração de tokens JWT com pares de chaves RSA
- Registro de clientes em memória
- Claims customizadas no token (username, authorities)
- Validação de tokens JWT
- Configuração CORS para requisições cross-origin
- Segurança habilitada a nível de método
- Mapeamento customizado de autoridades
POST /oauth2/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64(client_id:client_secret)>
grant_type=password&username=usuario@exemplo.com&password=senha123&scope=read write{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 86400,
"scope": "read write"
}{
"sub": "client-id",
"aud": ["client-id"],
"username": "usuario@exemplo.com",
"authorities": ["ROLE_USER", "ROLE_ADMIN"],
"scope": ["read", "write"],
"iss": "http://localhost:8080",
"exp": 1640995200,
"iat": 1640908800
}src/main/java/com/devsuperior/dscommerce/
├── Start.java # Classe principal da aplicação
├── config/security/
│ ├── AuthorizationServerConfig.java # Configuração do Servidor de Autorização OAuth2
│ ├── ResourceServerConfig.java # Configuração do Servidor de Recursos
│ └── customgrant/
│ ├── CustomPasswordAuthenticationConverter.java
│ ├── CustomPasswordAuthenticationProvider.java
│ ├── CustomPasswordAuthenticationToken.java
│ └── CustomUserAuthorities.java
├── exceptions/
│ ├── DatabaseException.java
│ ├── ForbbidenException.java
│ ├── ResourceNotFoundException.java
│ ├── UsernameNotFoundException.java
│ └── handler/
│ ├── GlobalExceptionHandler.java
│ └── error/
│ ├── CustomError.java
│ ├── FieldError.java
│ └── ValidationError.java
└── projections/
└── UserDetailsProjection.java
- Docker
- Docker Compose
O projeto inclui configuração Docker para banco de dados MySQL:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: dscommerce-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dscommerce
MYSQL_USER: dscommerce
MYSQL_PASSWORD: dscommerce123
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- dscommerce-network
app:
build: .
container_name: dscommerce-app
restart: always
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=docker
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/dscommerce
- SPRING_DATASOURCE_USERNAME=dscommerce
- SPRING_DATASOURCE_PASSWORD=dscommerce123
depends_on:
- mysql
networks:
- dscommerce-network
volumes:
mysql_data:
networks:
dscommerce-network:
driver: bridgeFROM openjdk:17-jdk-slim
# Definir diretório de trabalho
WORKDIR /app
# Copiar Maven wrapper e pom.xml
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
# Tornar mvnw executável
RUN chmod +x ./mvnw
# Baixar dependências
RUN ./mvnw dependency:go-offline -B
# Copiar código fonte
COPY src src
# Construir aplicação
RUN ./mvnw clean package -DskipTests
# Expor porta
EXPOSE 8080
# Executar aplicação
CMD ["java", "-jar", "target/dscommerce-0.0.1-SNAPSHOT.jar"]- Clonar o repositório
git clone <url-do-repositorio>
cd dscommerce- Iniciar os serviços
docker-compose up -d- Verificar logs
docker-compose logs -f app- Parar serviços
docker-compose downCriar application-docker.properties:
# Configuração do Banco de Dados
spring.datasource.url=jdbc:mysql://mysql:3306/dscommerce
spring.datasource.username=dscommerce
spring.datasource.password=dscommerce123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Configuração JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# Configuração de Segurança
security.client-id=dscommerce-client
security.client-secret=dscommerce-secret
security.jwt.duration=86400
# Configuração CORS
cors.origins=http://localhost:3000,http://localhost:4200,http://localhost:8081- Clonar o repositório
git clone <url-do-repositorio>
cd dscommerce- Iniciar MySQL com Docker
docker-compose up -d mysql- Configurar propriedades da aplicação
spring.datasource.url=jdbc:mysql://localhost:3306/dscommerce
spring.datasource.username=dscommerce
spring.datasource.password=dscommerce123- Executar a aplicação
./mvnw spring-boot:run- Construir e executar tudo
docker-compose up --build- Aplicação estará disponível em:
- Aplicação: http://localhost:8080
- MySQL: localhost:3306
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /oauth2/token |
Obter token de acesso |
Todos os outros endpoints requerem autenticação Bearer token:
Authorization: Bearer <access_token># Executar todos os testes
./mvnw test
# Executar testes com cobertura
./mvnw test jacoco:report# Limpar e construir
./mvnw clean package
# Pular testes
./mvnw clean package -DskipTestsA aplicação usa auto-update do Hibernate DDL. Para produção, considere usar Flyway ou Liquibase:
spring.jpa.hibernate.ddl-auto=validate
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration- Valida username e password contra UserDetailsService
- Gera tokens JWT com claims customizadas
- Suporta autorização baseada em escopo
- Manipulação thread-safe do contexto de autenticação
- Handler global de exceções para respostas de erro consistentes
- Exceções customizadas para diferentes cenários de erro
- Tratamento de erros de validação com detalhes a nível de campo
- Origens permitidas configuráveis
- Suporte para credenciais
- Métodos HTTP e cabeçalhos flexíveis
curl -X POST http://localhost:8080/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: Basic $(echo -n 'dscommerce-client:dscommerce-secret' | base64)" \
-d "grant_type=password&username=usuario@exemplo.com&password=123456&scope=read write"curl -X GET http://localhost:8080/api/products \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."-
Conexão com Banco de Dados
- Certifique-se de que o MySQL está rodando
- Verifique as credenciais do banco
- Confirme se o banco de dados existe
-
Problemas com Token JWT
- Verifique expiração do token
- Confirme credenciais do cliente
- Certifique-se do formato Bearer correto
-
Erros CORS
- Atualize a propriedade
cors.origins - Verifique requisições preflight
- Confirme cabeçalhos permitidos
- Atualize a propriedade
Habilitar logging debug para segurança:
logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.security.oauth2=DEBUG- Faça um fork do repositório
- Crie uma branch para sua feature (
git checkout -b feature/funcionalidade-incrivel) - Commit suas mudanças (
git commit -m 'Adiciona funcionalidade incrível') - Push para a branch (
git push origin feature/funcionalidade-incrivel) - Abra um Pull Request
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
- Spring Security OAuth2 Authorization Server
- Documentação Spring Boot
- JWT.io - Debugger de tokens JWT
- Documentação Docker
Para suporte e dúvidas:
- Crie uma issue no repositório
- Consulte a documentação existente
- Revise o Stack Overflow para soluções comuns
Gabriel lucas rodrigues souza
LinkedIn: https://www.linkedin.com/in/gabriellglrs/
