ADR-002: TEACHER Migrat de Rol de Seguretat a Rol de Domini
Estat: Acceptat
Data: 2024-12
Decisors: Equip LDP
Fase: Phase 2B
Context
Originalment, TEACHER era un dels tres rols de seguretat (USER, TEACHER, ADMIN) a l'enum Role.java. Això permetia que els usuaris amb rol TEACHER poguessin crear i editar qualsevol recurs (Dance, Song, Event, Location, Venue) via hasAnyRole('TEACHER', 'ADMIN') a SecurityConfig i @PreAuthorize.
Problemes
- Escalada de privilegis implícita: Qualsevol TEACHER podia editar recursos creats per altres TEACHERs.
- Confusió conceptual: "Professor de line dance" és una identitat de domini, no un nivell de permisos.
- BOLA vulnerability: Els checks a nivell de rol no validaven ownership.
- Rigidesa: Afegir nous rols de domini (DJ, CHOREOGRAPHER) implicava modificar l'enum de seguretat.
Decisió
TEACHER es mou de rol de seguretat a rol de domini.
Canvis Implementats
- Enum
Role.java: Només contéUSERiADMIN. - Enum
PersonRoleType: ContéTEACHER,CHOREOGRAPHER,DJ,ARTIST,STAFF,GUEST. SecurityConfig: POST/PUT requereixenauthenticated(), nohasAnyRole('TEACHER', 'ADMIN').- Autorització d'edició: Basada en ownership (
owner_id) + ADMIN override, validada al service layer. promoteToTeacher(): Només assignaPersonRoleType.TEACHER, no canvia el rol de seguretat.
Diagrama de Rols
┌─────────────────────────────────────────────────────────────┐
│ CAPA DE SEGURETAT (Role.java) │
│ ───────────────────────────────── │
│ USER → Usuari autenticat estàndard │
│ ADMIN → Accés administratiu complet │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ CAPA DE DOMINI (PersonRoleType.java) │
│ ──────────────────────────────────── │
│ TEACHER → Professor de line dance │
│ CHOREOGRAPHER → Creador de coreografies │
│ DJ → Disc jockey │
│ ARTIST → Artista musical │
│ STAFF → Personal d'organització │
│ GUEST → Convidat │
└─────────────────────────────────────────────────────────────┘
Conseqüències
Positives
- ✅ Separació clara entre autenticació/autorització (RBAC) i identitat de domini.
- ✅ BOLA enforcement: L'edició es valida per ownership, no per rol genèric.
- ✅ Extensibilitat: Nous rols de domini no afecten la seguretat.
- ✅ Principle of Least Privilege: Només el propietari o ADMIN pot editar.
Negatives
- ⚠️ Migració: El frontend haurà d'adaptar-se per no dependre de
role === "TEACHER". - ⚠️ Retrocompatibilitat: Usuaris amb
Role.TEACHERa BD hauran de ser migrats aRole.USER+PersonRoleType.TEACHER.
Accions Pendents
- Migració de BD per convertir
users.role = 'TEACHER'a'USER'+ crearPersonRole.TEACHER. - Actualitzar frontend per usar
personRoles.includes('TEACHER')en lloc derole === 'TEACHER'. - Revisar altres recursos (Dance, Song, Event) per assegurar BOLA consistent.