ADR-005: Model de Permisos de 3 Capes
Data: 2026-03 Estat: Dissenyat (Fase 1: camps BD preparats, Fase 2: trust levels) Decisors: Equip de desenvolupament LDP
Context
La plataforma necessita un sistema de permisos que governi:
- Que pot fer un usuari (seguretat)
- Quant de confiable es (verificacio progressiva)
- Que ha pagat (monetitzacio futura)
Aquestes tres dimensions son independents: un coreograf PRO verificat i un admin gratuit tenen permisos molt diferents.
Decisio
Arquitectura de 3 capes independents
Capa 1: RBAC (Security Role) → USER, ADMIN
Capa 2: Trust Level (computat) → 0-4
Capa 3: Subscription Tier (futur) → FREE, BASIC, PRO
Capa 1: RBAC
Rols de seguretat existents (security/Role.java). Es comproven a SecurityConfig i @PreAuthorize.
Capa 2: Trust Level (Fase 2)
Nivell de confianca computat a partir de les verificacions completades:
| Nivell | Nom | Requisits |
|---|---|---|
| 0 | Registrat | Email no verificat |
| 1 | Verificat | Email ok + consents ok |
| 2 | Identificat | Perfil complet (nom, pais, edat) |
| 3 | Reclamat | Ownership aprovat |
| 4 | Badge | Admin manual |
Capa 3: Subscription Tier (futur)
Camp subscription_tier a users (DEFAULT 'FREE'). Preparat a la BD pero sense logica de pagament.
Capa Domini: PersonRole
Ortogonal a les 3 capes. Indica el rol al mon del line dance (CHOREOGRAPHER, TEACHER, DJ, etc.), no afecta permisos de seguretat.
On es comprova cada capa
// Capa 1: SecurityConfig + @PreAuthorize
@PreAuthorize("hasRole('ADMIN')")
// Capa 2: Service layer (Fase 2)
trustLevelService.checkMinimumTrust(userId, 2);
// Capa 3: Service layer (futur)
subscriptionService.checkFeatureAccess(userId, Feature.X);
Consequencies
users.subscription_tieriusers.account_typecreats a V65- El trust level es computat, no emmagatzemat directament (Fase 2 afegira taula
user_verifications) - La separacio de capes evita acoblament entre seguretat, verificacio i monetitzacio
- PersonRole segueix sent purament descriptiu del domini
Fitxers clau
- Enums:
SubscriptionTier.java,AccountType.java - Entitat:
User.java(campssubscriptionTier,accountType) - Migracio:
V65__add_age_verification_and_subscription.sql