Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

PedidosApp

Java Spring Boot Spring Security MySQL

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.


Contexto

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

Stack

  • 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

Estructura del proyecto

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

Configuración

Requisitos previos

  • Java 21
  • Maven
  • XAMPP con MySQL activo

Base de datos

Hibernate crea las tablas automáticamente al levantar la app (ddl-auto=update).

application.properties

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=86400000

Levantar el proyecto

mvn spring-boot:run

Al iniciar, DataInitializer carga tres usuarios de prueba:

Email Contraseña Rol
[email protected] admin123 ADMIN
[email protected] user123 USER
[email protected] delivery123 DELIVERY

Endpoints

Autenticación — públicos

POST /api/auth/register
POST /api/auth/login       → devuelve { token, role, email, nombre }

Pedidos — requiere rol USER

POST  /api/pedidos                → crear pedido
GET   /api/pedidos/mis-pedidos    → ver mis pedidos

Delivery — requiere rol DELIVERY

GET   /api/delivery/mis-rutas
PATCH /api/delivery/{id}/en-camino
PATCH /api/delivery/{id}/entregado

Admin — requiere rol ADMIN

GET   /api/admin/pedidos
GET   /api/admin/usuarios
PATCH /api/admin/pedidos/{pedidoId}/asignar/{repartidorId}

Autenticación con JWT

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

Dependencias Maven

<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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages