{"id":26694016,"url":"https://github.com/gabriellglrs/dscommerce","last_synced_at":"2026-04-11T17:47:42.977Z","repository":{"id":254757302,"uuid":"847438718","full_name":"gabriellglrs/DsCommerce","owner":"gabriellglrs","description":"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.","archived":false,"fork":false,"pushed_at":"2025-06-04T16:51:08.000Z","size":43665,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-13T12:51:59.025Z","etag":null,"topics":["autentication","docker","docker-compose","dockerfile","java-17","jwt-token","lombok","maven","mysql","oauth2","restful-api","spring-boot","spring-security","validation"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabriellglrs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-25T20:25:22.000Z","updated_at":"2025-06-04T16:51:12.000Z","dependencies_parsed_at":"2024-11-20T23:26:41.765Z","dependency_job_id":"e754d6cd-7465-40fd-8f1b-2b7e3cba1b25","html_url":"https://github.com/gabriellglrs/DsCommerce","commit_stats":null,"previous_names":["gabriellglrs/dscommerce"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gabriellglrs/DsCommerce","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabriellglrs%2FDsCommerce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabriellglrs%2FDsCommerce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabriellglrs%2FDsCommerce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabriellglrs%2FDsCommerce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabriellglrs","download_url":"https://codeload.github.com/gabriellglrs/DsCommerce/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabriellglrs%2FDsCommerce/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263934829,"owners_count":23532210,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autentication","docker","docker-compose","dockerfile","java-17","jwt-token","lombok","maven","mysql","oauth2","restful-api","spring-boot","spring-security","validation"],"created_at":"2025-03-26T18:28:10.170Z","updated_at":"2026-04-11T17:47:42.970Z","avatar_url":"https://github.com/gabriellglrs.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg width=100% src=\"https://capsule-render.vercel.app/api?type=waving\u0026color=4C89F8\u0026height=120\u0026section=header\"/\u003e\n\n\u003cimg width=\"1584\" height=\"396\" alt=\"LinkedIn cover - 29\" src=\"https://github.com/user-attachments/assets/1a289448-2b68-4e72-9c32-90d1663cf5d2\" /\u003e\n\n\n\n# DSCommerce\n\nUma 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.\n\n## 🚀 Funcionalidades\n\n- **Servidor de Autorização OAuth2**: Implementação customizada com suporte a tokens JWT\n- **Password Grant Customizado**: Implementação personalizada do OAuth2 password grant type\n- **Configuração de Segurança**: Setup de segurança completo com suporte a CORS\n- **Tratamento de Exceções**: Handler global de exceções com respostas de erro customizadas\n- **Autenticação JWT**: Tokens JWT auto-contidos com claims customizadas\n- **Autorização Baseada em Funções**: Gerenciamento de autoridades e escopos de usuários\n\n## 🛠 Tecnologias\n\n- **Java 17+**\n- **Spring Boot 3.x**\n- **Spring Security OAuth2 Authorization Server**\n- **Spring Data JPA**\n- **JWT (JSON Web Tokens)**\n- **Criptografia BCrypt**\n- **Lombok**\n- **Maven**\n- **MySQL**\n- **Docker \u0026 Docker Compose**\n\n## 📋 Pré-requisitos\n\n- Java 17 ou superior\n- Maven 3.6+\n- Docker e Docker Compose\n- MySQL (via Docker)\n\n## ⚙️ Configuração\n\n### Configuração do Banco de Dados\n\nCrie um arquivo `application.properties` com as seguintes configurações:\n\n```properties\n# Configuração do Banco de Dados (MySQL)\nspring.datasource.url=jdbc:mysql://localhost:3306/dscommerce\nspring.datasource.username=dscommerce\nspring.datasource.password=dscommerce123\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\n# Configuração JPA\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect\nspring.jpa.show-sql=true\n\n# Configuração de Segurança\nsecurity.client-id=dscommerce-client\nsecurity.client-secret=dscommerce-secret\nsecurity.jwt.duration=86400\n\n# Configuração CORS  \ncors.origins=http://localhost:3000,http://localhost:4200,http://localhost:8081\n```\n\n### Recursos de Segurança\n\n#### Servidor de Autorização OAuth2\n- Implementação customizada do password grant type\n- Geração de tokens JWT com pares de chaves RSA\n- Registro de clientes em memória\n- Claims customizadas no token (username, authorities)\n\n#### Servidor de Recursos\n- Validação de tokens JWT\n- Configuração CORS para requisições cross-origin\n- Segurança habilitada a nível de método\n- Mapeamento customizado de autoridades\n\n## 🔐 Fluxo de Autenticação\n\n### Password Grant Type\n\n```http\nPOST /oauth2/token\nContent-Type: application/x-www-form-urlencoded\nAuthorization: Basic \u003cbase64(client_id:client_secret)\u003e\n\ngrant_type=password\u0026username=usuario@exemplo.com\u0026password=senha123\u0026scope=read write\n```\n\n### Resposta\n\n```json\n{\n  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 86400,\n  \"scope\": \"read write\"\n}\n```\n\n### Claims do Token JWT\n\n```json\n{\n  \"sub\": \"client-id\",\n  \"aud\": [\"client-id\"],\n  \"username\": \"usuario@exemplo.com\",\n  \"authorities\": [\"ROLE_USER\", \"ROLE_ADMIN\"],\n  \"scope\": [\"read\", \"write\"],\n  \"iss\": \"http://localhost:8080\",\n  \"exp\": 1640995200,\n  \"iat\": 1640908800\n}\n```\n\n## 🏗 Estrutura do Projeto\n\n```\nsrc/main/java/com/devsuperior/dscommerce/\n├── Start.java                              # Classe principal da aplicação\n├── config/security/\n│   ├── AuthorizationServerConfig.java      # Configuração do Servidor de Autorização OAuth2\n│   ├── ResourceServerConfig.java           # Configuração do Servidor de Recursos\n│   └── customgrant/\n│       ├── CustomPasswordAuthenticationConverter.java\n│       ├── CustomPasswordAuthenticationProvider.java\n│       ├── CustomPasswordAuthenticationToken.java\n│       └── CustomUserAuthorities.java\n├── exceptions/\n│   ├── DatabaseException.java\n│   ├── ForbbidenException.java\n│   ├── ResourceNotFoundException.java\n│   ├── UsernameNotFoundException.java\n│   └── handler/\n│       ├── GlobalExceptionHandler.java\n│       └── error/\n│           ├── CustomError.java\n│           ├── FieldError.java\n│           └── ValidationError.java\n└── projections/\n    └── UserDetailsProjection.java\n```\n\n## 🐳 Configuração Docker\n\n### Pré-requisitos Docker\n- Docker\n- Docker Compose\n\n### Configuração do Banco de Dados com Docker\n\nO projeto inclui configuração Docker para banco de dados MySQL:\n\n#### docker-compose.yml\n```yaml\nversion: '3.8'\n\nservices:\n  mysql:\n    image: mysql:8.0\n    container_name: dscommerce-mysql\n    restart: always\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_DATABASE: dscommerce\n      MYSQL_USER: dscommerce\n      MYSQL_PASSWORD: dscommerce123\n    ports:\n      - \"3306:3306\"\n    volumes:\n      - mysql_data:/var/lib/mysql\n    networks:\n      - dscommerce-network\n\n  app:\n    build: .\n    container_name: dscommerce-app\n    restart: always\n    ports:\n      - \"8080:8080\"\n    environment:\n      - SPRING_PROFILES_ACTIVE=docker\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/dscommerce\n      - SPRING_DATASOURCE_USERNAME=dscommerce\n      - SPRING_DATASOURCE_PASSWORD=dscommerce123\n    depends_on:\n      - mysql\n    networks:\n      - dscommerce-network\n\nvolumes:\n  mysql_data:\n\nnetworks:\n  dscommerce-network:\n    driver: bridge\n```\n\n#### Dockerfile\n```dockerfile\nFROM openjdk:17-jdk-slim\n\n# Definir diretório de trabalho\nWORKDIR /app\n\n# Copiar Maven wrapper e pom.xml\nCOPY mvnw .\nCOPY .mvn .mvn\nCOPY pom.xml .\n\n# Tornar mvnw executável\nRUN chmod +x ./mvnw\n\n# Baixar dependências\nRUN ./mvnw dependency:go-offline -B\n\n# Copiar código fonte\nCOPY src src\n\n# Construir aplicação\nRUN ./mvnw clean package -DskipTests\n\n# Expor porta\nEXPOSE 8080\n\n# Executar aplicação\nCMD [\"java\", \"-jar\", \"target/dscommerce-0.0.1-SNAPSHOT.jar\"]\n```\n\n### Executando com Docker\n\n1. **Clonar o repositório**\n```bash\ngit clone \u003curl-do-repositorio\u003e\ncd dscommerce\n```\n\n2. **Iniciar os serviços**\n```bash\ndocker-compose up -d\n```\n\n3. **Verificar logs**\n```bash\ndocker-compose logs -f app\n```\n\n4. **Parar serviços**\n```bash\ndocker-compose down\n```\n\n### Propriedades da Aplicação para Docker\n\nCriar `application-docker.properties`:\n\n```properties\n# Configuração do Banco de Dados\nspring.datasource.url=jdbc:mysql://mysql:3306/dscommerce\nspring.datasource.username=dscommerce\nspring.datasource.password=dscommerce123\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n\n# Configuração JPA\nspring.jpa.hibernate.ddl-auto=update\nspring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect\nspring.jpa.show-sql=true\nspring.jpa.properties.hibernate.format_sql=true\n\n# Configuração de Segurança\nsecurity.client-id=dscommerce-client\nsecurity.client-secret=dscommerce-secret\nsecurity.jwt.duration=86400\n\n# Configuração CORS\ncors.origins=http://localhost:3000,http://localhost:4200,http://localhost:8081\n```\n\n## 🚀 Começando\n\n### Desenvolvimento Local\n\n1. **Clonar o repositório**\n```bash\ngit clone \u003curl-do-repositorio\u003e\ncd dscommerce\n```\n\n2. **Iniciar MySQL com Docker**\n```bash\ndocker-compose up -d mysql\n```\n\n3. **Configurar propriedades da aplicação**\n```properties\nspring.datasource.url=jdbc:mysql://localhost:3306/dscommerce\nspring.datasource.username=dscommerce\nspring.datasource.password=dscommerce123\n```\n\n4. **Executar a aplicação**\n```bash\n./mvnw spring-boot:run\n```\n\n### Desenvolvimento com Docker\n\n1. **Construir e executar tudo**\n```bash\ndocker-compose up --build\n```\n\n2. **Aplicação estará disponível em:**\n- Aplicação: http://localhost:8080\n- MySQL: localhost:3306\n\n## 📊 Endpoints da API\n\n### Endpoints de Autenticação\n\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| POST   | `/oauth2/token` | Obter token de acesso |\n\n### Recursos Protegidos\n\nTodos os outros endpoints requerem autenticação Bearer token:\n\n```http\nAuthorization: Bearer \u003caccess_token\u003e\n```\n\n## 🔧 Desenvolvimento\n\n### Executando Testes\n\n```bash\n# Executar todos os testes\n./mvnw test\n\n# Executar testes com cobertura\n./mvnw test jacoco:report\n```\n\n### Construindo a Aplicação\n\n```bash\n# Limpar e construir\n./mvnw clean package\n\n# Pular testes\n./mvnw clean package -DskipTests\n```\n\n### Migração do Banco de Dados\n\nA aplicação usa auto-update do Hibernate DDL. Para produção, considere usar Flyway ou Liquibase:\n\n```properties\nspring.jpa.hibernate.ddl-auto=validate\nspring.flyway.enabled=true\nspring.flyway.locations=classpath:db/migration\n```\n\n## 🔒 Recursos de Segurança\n\n### Fluxo de Password Grant Customizado\n- Valida username e password contra UserDetailsService\n- Gera tokens JWT com claims customizadas\n- Suporta autorização baseada em escopo\n- Manipulação thread-safe do contexto de autenticação\n\n### Tratamento de Exceções\n- Handler global de exceções para respostas de erro consistentes\n- Exceções customizadas para diferentes cenários de erro\n- Tratamento de erros de validação com detalhes a nível de campo\n\n### Configuração CORS\n- Origens permitidas configuráveis\n- Suporte para credenciais\n- Métodos HTTP e cabeçalhos flexíveis\n\n## 📝 Exemplos de Uso\n\n### Obtendo Token de Acesso\n\n```bash\ncurl -X POST http://localhost:8080/oauth2/token \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -H \"Authorization: Basic $(echo -n 'dscommerce-client:dscommerce-secret' | base64)\" \\\n  -d \"grant_type=password\u0026username=usuario@exemplo.com\u0026password=123456\u0026scope=read write\"\n```\n\n### Usando Token de Acesso\n\n```bash\ncurl -X GET http://localhost:8080/api/products \\\n  -H \"Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n```\n\n## 🐛 Solução de Problemas\n\n### Problemas Comuns\n\n1. **Conexão com Banco de Dados**\n   - Certifique-se de que o MySQL está rodando\n   - Verifique as credenciais do banco\n   - Confirme se o banco de dados existe\n\n2. **Problemas com Token JWT**\n   - Verifique expiração do token\n   - Confirme credenciais do cliente\n   - Certifique-se do formato Bearer correto\n\n3. **Erros CORS**\n   - Atualize a propriedade `cors.origins`\n   - Verifique requisições preflight\n   - Confirme cabeçalhos permitidos\n\n### Logs\n\nHabilitar logging debug para segurança:\n\n```properties\nlogging.level.org.springframework.security=DEBUG\nlogging.level.org.springframework.security.oauth2=DEBUG\n```\n\n## 🤝 Contribuindo\n\n1. Faça um fork do repositório\n2. Crie uma branch para sua feature (`git checkout -b feature/funcionalidade-incrivel`)\n3. Commit suas mudanças (`git commit -m 'Adiciona funcionalidade incrível'`)\n4. Push para a branch (`git push origin feature/funcionalidade-incrivel`)\n5. Abra um Pull Request\n\n## 📄 Licença\n\nEste projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.\n\n## 🔗 Links Úteis\n\n- [Spring Security OAuth2 Authorization Server](https://spring.io/projects/spring-authorization-server)\n- [Documentação Spring Boot](https://spring.io/projects/spring-boot)\n- [JWT.io](https://jwt.io/) - Debugger de tokens JWT\n- [Documentação Docker](https://docs.docker.com/)\n\n## 📞 Suporte\n\nPara suporte e dúvidas:\n- Crie uma issue no repositório\n- Consulte a documentação existente\n- Revise o Stack Overflow para soluções comuns\n\n----\n\n## Autor\n Gabriel lucas rodrigues souza\n \u003cbr\u003e\nLinkedIn: https://www.linkedin.com/in/gabriellglrs/\n \u003cbr\u003e\n\n \u003cbr\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/ed7208b8-6bdc-4c82-98aa-8c8cb9c1428f\" height=\"150\"/\u003e\n\u003c/div\u003e\n\n\u003cimg width=100% src=\"https://capsule-render.vercel.app/api?type=waving\u0026color=4C89F8\u0026height=120\u0026section=footer\"/\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabriellglrs%2Fdscommerce","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabriellglrs%2Fdscommerce","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabriellglrs%2Fdscommerce/lists"}