API REST construida con Spring Boot para autenticacion con JWT, autorizacion por roles y gestion basica de usuarios.
- Validacion de entrada en login y registro.
- Passwords cifrados con BCrypt.
- Roles asignados de forma controlada.
- Manejador global de errores con respuestas JSON consistentes.
- Configuracion CORS centralizada.
- Tests aislados con H2 para no depender de una base externa.
- Java 21
- Spring Boot 3.5
- Spring Web
- Spring Security
- Spring Data JPA
- PostgreSQL
- JWT (
jjwt) - Lombok
- JUnit 5 / Mockito / H2
src/main/java/com/example/demogc
|- config/security Configuracion de Spring Security y JWT
|- controller Endpoints REST
|- dto Objetos de entrada y salida
|- exception Errores de negocio y handler global
|- mapper Transformacion entre entidades y DTOs
|- model Entidades JPA
|- repository Acceso a datos
|- service Contratos y logica de negocio
- Registro de usuarios.
- Inicio de sesion con JWT.
- Consulta de usuarios solo para
ADMIN. - Consulta de usuario por id solo para
ADMIN. - Eliminacion de usuarios solo para
ADMIN.
El endpoint /api/register crea usuarios con rol USER por defecto.
No se concede el rol ADMIN automaticamente por dominio de email ni por datos controlados por el cliente.
Puedes crear el primer administrador de forma segura al arrancar la aplicacion usando variables de entorno. Solo se crea si:
ADMIN_BOOTSTRAP_ENABLED=true- no existe todavia ningun usuario con rol
ADMIN
Variables:
ADMIN_BOOTSTRAP_ENABLED=true
ADMIN_USERNAME=superadmin
ADMIN_EMAIL=superadmin@example.com
ADMIN_PASSWORD=ChangeMeNow123!
ADMIN_NAME=Administrador Inicial
ADMIN_PHONE=123456789
ADMIN_BUSINESS_TITLE=Platform AdministratorDespues del primer arranque, la recomendacion es desactivar:
ADMIN_BOOTSTRAP_ENABLED=falseEl endpoint /api/authentication autentica credenciales y devuelve un token JWT.
El token incluye el nombre del usuario autenticado y sus autoridades. Debe enviarse en el header:
Authorization: Bearer <token>ROLE_USER: usuario registrado.ROLE_ADMIN: acceso a endpoints administrativos.ROLE_MANAGER: rol semilla disponible en base de datos.
DB_USER=postgres
DB_PASSWORD=postgres
JWT_SIGNING_KEY=change-this-default-jwt-secret-key-to-a-long-random-value
APP_ALLOWED_ORIGINS=http://localhost:3000Configuracion principal incluida:
- PostgreSQL en
jdbc:postgresql://localhost:5432/jwt_roles_db ddl-auto=update- inicializacion SQL activa para sembrar roles
- expiracion JWT configurable
Al iniciar la aplicacion se insertan roles base desde src/main/resources/data.sql:
ADMINMANAGERUSER
git clone <repo-url>
cd api-spring-security-jwt-rolesCrea una base llamada jwt_roles_db y define las variables de entorno necesarias.
En Windows:
./mvnw.cmd spring-boot:runEn Linux o macOS:
./mvnw spring-boot:runLos tests usan un perfil test con H2 en memoria, por lo que no requieren PostgreSQL.
./mvnw.cmd testLa documentacion interactiva queda disponible en:
http://localhost:8080/swagger-ui/index.htmlhttp://localhost:8080/v3/api-docs
Swagger UI soporta autenticacion Bearer JWT. Primero autentica en /api/authentication, copia el token y luego usa el boton Authorize.
POST /api/register
Body:
{
"username": "user1",
"email": "user1@example.com",
"password": "Secret123",
"name": "User 1",
"phone": 123456789,
"businessTitle": "Backend Developer"
}Respuesta esperada: 201 Created
POST /api/authentication
Body:
{
"username": "user1",
"password": "Secret123"
}Respuesta:
{
"token": "<jwt>"
}GET /api/users
Requiere ROLE_ADMIN.
GET /api/users/me
Disponible para cualquier usuario autenticado.
PATCH /api/users/me
Disponible para cualquier usuario autenticado.
Body:
{
"email": "nuevo@email.com",
"name": "Nombre Actualizado",
"phone": 123456789,
"businessTitle": "Backend Engineer"
}PATCH /api/users/me/password
Disponible para cualquier usuario autenticado.
Body:
{
"currentPassword": "Secret123",
"newPassword": "Secret456"
}DELETE /api/users/me
Disponible para cualquier usuario autenticado. Elimina la cuenta asociada al token actual.
GET /api/users/{id}
Requiere ROLE_ADMIN.
DELETE /api/users/{id}
Requiere ROLE_ADMIN.
PATCH /api/users/{id}/roles
Requiere ROLE_ADMIN.
Body:
{
"roles": ["ADMIN", "USER"]
}Este endpoint es la via correcta para promover o degradar privilegios. Un USER no puede autoasignarse roles.
- Añadir refresh tokens y revocacion de sesiones.
- Implementar paginacion en
/api/users. - Añadir endpoints para gestion explicita de roles por administradores.
- Incorporar auditoria y rate limiting.
- Reemplazar el secreto JWT por una clave rotada desde un secret manager.
Pendiente de definir.