https://github.com/gabriellglrs/dscommerce
DsCommerce Este sistema de e-commerce permite o cadastro de usuários, produtos e categorias. Usuários podem navegar no catálogo, adicionar produtos ao carrinho e finalizar pedidos, que têm status como "aguardando pagamento" ou "entregue". Administradores gerenciam cadastros e têm acesso a funcionalidades extras.
https://github.com/gabriellglrs/dscommerce
autentication docker docker-compose dockerfile java-17 jwt-token lombok maven mysql oauth2 restful-api spring-boot spring-security validation
Last synced: 7 months ago
JSON representation
DsCommerce Este sistema de e-commerce permite o cadastro de usuários, produtos e categorias. Usuários podem navegar no catálogo, adicionar produtos ao carrinho e finalizar pedidos, que têm status como "aguardando pagamento" ou "entregue". Administradores gerenciam cadastros e têm acesso a funcionalidades extras.
- Host: GitHub
- URL: https://github.com/gabriellglrs/dscommerce
- Owner: gabriellglrs
- Created: 2024-08-25T20:25:22.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-06-04T16:51:08.000Z (8 months ago)
- Last Synced: 2025-06-13T12:51:59.025Z (8 months ago)
- Topics: autentication, docker, docker-compose, dockerfile, java-17, jwt-token, lombok, maven, mysql, oauth2, restful-api, spring-boot, spring-security, validation
- Language: Java
- Homepage:
- Size: 41.6 MB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README


# DSCommerce
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.
## 🚀 Funcionalidades
- **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
## 🛠 Tecnologias
- **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**
## 📋 Pré-requisitos
- Java 17 ou superior
- Maven 3.6+
- Docker e Docker Compose
- MySQL (via Docker)
## ⚙️ Configuração
### Configuração do Banco de Dados
Crie um arquivo `application.properties` com as seguintes configurações:
```properties
# 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
```
### Recursos de Segurança
#### Servidor de Autorização OAuth2
- 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)
#### Servidor de Recursos
- 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
## 🔐 Fluxo de Autenticação
### Password Grant Type
```http
POST /oauth2/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic
grant_type=password&username=usuario@exemplo.com&password=senha123&scope=read write
```
### Resposta
```json
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 86400,
"scope": "read write"
}
```
### Claims do Token JWT
```json
{
"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
}
```
## 🏗 Estrutura do Projeto
```
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
```
## 🐳 Configuração Docker
### Pré-requisitos Docker
- Docker
- Docker Compose
### Configuração do Banco de Dados com Docker
O projeto inclui configuração Docker para banco de dados MySQL:
#### docker-compose.yml
```yaml
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: bridge
```
#### Dockerfile
```dockerfile
FROM 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"]
```
### Executando com Docker
1. **Clonar o repositório**
```bash
git clone
cd dscommerce
```
2. **Iniciar os serviços**
```bash
docker-compose up -d
```
3. **Verificar logs**
```bash
docker-compose logs -f app
```
4. **Parar serviços**
```bash
docker-compose down
```
### Propriedades da Aplicação para Docker
Criar `application-docker.properties`:
```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
```
## 🚀 Começando
### Desenvolvimento Local
1. **Clonar o repositório**
```bash
git clone
cd dscommerce
```
2. **Iniciar MySQL com Docker**
```bash
docker-compose up -d mysql
```
3. **Configurar propriedades da aplicação**
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/dscommerce
spring.datasource.username=dscommerce
spring.datasource.password=dscommerce123
```
4. **Executar a aplicação**
```bash
./mvnw spring-boot:run
```
### Desenvolvimento com Docker
1. **Construir e executar tudo**
```bash
docker-compose up --build
```
2. **Aplicação estará disponível em:**
- Aplicação: http://localhost:8080
- MySQL: localhost:3306
## 📊 Endpoints da API
### Endpoints de Autenticação
| Método | Endpoint | Descrição |
|--------|----------|-----------|
| POST | `/oauth2/token` | Obter token de acesso |
### Recursos Protegidos
Todos os outros endpoints requerem autenticação Bearer token:
```http
Authorization: Bearer
```
## 🔧 Desenvolvimento
### Executando Testes
```bash
# Executar todos os testes
./mvnw test
# Executar testes com cobertura
./mvnw test jacoco:report
```
### Construindo a Aplicação
```bash
# Limpar e construir
./mvnw clean package
# Pular testes
./mvnw clean package -DskipTests
```
### Migração do Banco de Dados
A aplicação usa auto-update do Hibernate DDL. Para produção, considere usar Flyway ou Liquibase:
```properties
spring.jpa.hibernate.ddl-auto=validate
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
```
## 🔒 Recursos de Segurança
### Fluxo de Password Grant Customizado
- 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
### Tratamento de Exceções
- 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
### Configuração CORS
- Origens permitidas configuráveis
- Suporte para credenciais
- Métodos HTTP e cabeçalhos flexíveis
## 📝 Exemplos de Uso
### Obtendo Token de Acesso
```bash
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"
```
### Usando Token de Acesso
```bash
curl -X GET http://localhost:8080/api/products \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
```
## 🐛 Solução de Problemas
### Problemas Comuns
1. **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
2. **Problemas com Token JWT**
- Verifique expiração do token
- Confirme credenciais do cliente
- Certifique-se do formato Bearer correto
3. **Erros CORS**
- Atualize a propriedade `cors.origins`
- Verifique requisições preflight
- Confirme cabeçalhos permitidos
### Logs
Habilitar logging debug para segurança:
```properties
logging.level.org.springframework.security=DEBUG
logging.level.org.springframework.security.oauth2=DEBUG
```
## 🤝 Contribuindo
1. Faça um fork do repositório
2. Crie uma branch para sua feature (`git checkout -b feature/funcionalidade-incrivel`)
3. Commit suas mudanças (`git commit -m 'Adiciona funcionalidade incrível'`)
4. Push para a branch (`git push origin feature/funcionalidade-incrivel`)
5. Abra um Pull Request
## 📄 Licença
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
## 🔗 Links Úteis
- [Spring Security OAuth2 Authorization Server](https://spring.io/projects/spring-authorization-server)
- [Documentação Spring Boot](https://spring.io/projects/spring-boot)
- [JWT.io](https://jwt.io/) - Debugger de tokens JWT
- [Documentação Docker](https://docs.docker.com/)
## 📞 Suporte
Para suporte e dúvidas:
- Crie uma issue no repositório
- Consulte a documentação existente
- Revise o Stack Overflow para soluções comuns
----
## Autor
Gabriel lucas rodrigues souza
LinkedIn: https://www.linkedin.com/in/gabriellglrs/