REST API monolítica de gestión de pedidos con delivery. Construida para demostrar autenticación y autorización con Spring Security + JWT y control de acceso por roles.
Simula el backend de una app tipo PedidosYa simplificada. Hay tres actores con accesos distintos:
| Rol | Descripción |
|---|---|
USER |
Cliente que crea y consulta sus pedidos |
DELIVERY |
Repartidor que gestiona sus rutas y actualiza estados |
ADMIN |
Acceso total: usuarios, pedidos, asignaciones |
El ciclo de vida de un pedido sigue este orden:
PENDIENTE → ASIGNADO → EN_CAMINO → ENTREGADO
- Java 21 con records para DTOs
- Spring Boot 4 — Web, Security, Data JPA
- JJWT 0.12.6 para generación y validación de tokens
- MySQL vía XAMPP en desarrollo local
- Lombok para reducir boilerplate
- BCrypt para hash de contraseñas
src/main/java/com/pedidosapp/
├── config/
│ └── DataInitializer.java # Usuarios de prueba al iniciar
├── controller/
│ ├── AuthController.java # POST /api/auth/login y /register
│ ├── PedidoController.java # Rutas del cliente (USER)
│ ├── DeliveryController.java # Rutas del repartidor (DELIVERY)
│ └── AdminController.java # Rutas de administración (ADMIN)
├── model/
│ ├── Role.java # Enum: ADMIN, USER, DELIVERY
│ ├── Usuario.java # Entidad + implementación de UserDetails
│ └── Pedido.java # Entidad con estados y relaciones
├── repository/
│ ├── UsuarioRepository.java
│ └── PedidoRepository.java
├── security/
│ ├── SecurityConfig.java # Cadena de filtros, reglas de autorización
│ ├── JwtUtil.java # Generar, validar y parsear tokens
│ └── JwtAuthFilter.java # Filtro que intercepta cada request
└── service/
├── UsuarioDetailsService.java # Implementación de UserDetailsService
└── PedidoService.java # Lógica de negocio de pedidos
- Java 21
- Maven
- XAMPP con MySQL activo
Hibernate crea las tablas automáticamente al levantar la app (ddl-auto=update).
spring.datasource.url=jdbc:mysql://localhost:3306/pedidosdb?createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
jwt.secret=<tu-clave-en-base64>
jwt.expiration=86400000mvn spring-boot:runAl iniciar, DataInitializer carga tres usuarios de prueba:
| Contraseña | Rol | |
|---|---|---|
[email protected] |
admin123 |
ADMIN |
[email protected] |
user123 |
USER |
[email protected] |
delivery123 |
DELIVERY |
POST /api/auth/register
POST /api/auth/login → devuelve { token, role, email, nombre }
POST /api/pedidos → crear pedido
GET /api/pedidos/mis-pedidos → ver mis pedidos
GET /api/delivery/mis-rutas
PATCH /api/delivery/{id}/en-camino
PATCH /api/delivery/{id}/entregado
GET /api/admin/pedidos
GET /api/admin/usuarios
PATCH /api/admin/pedidos/{pedidoId}/asignar/{repartidorId}
Todos los endpoints protegidos requieren el token en el header:
Authorization: Bearer <token>
El token se obtiene desde POST /api/auth/login. Expira en 24 horas por defecto.
Flujo interno por request:
Request → JwtAuthFilter → extrae email del token
→ UserDetailsService carga usuario desde BD
→ JwtUtil valida firma y expiración
→ SecurityContext registra la autenticación
→ Controller recibe la request con el usuario inyectado
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.6</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.12.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.12.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>Proyecto de demostración académica — Sebithaz-dev.