Skip to main content

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:

  1. Que pot fer un usuari (seguretat)
  2. Quant de confiable es (verificacio progressiva)
  3. 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:

NivellNomRequisits
0RegistratEmail no verificat
1VerificatEmail ok + consents ok
2IdentificatPerfil complet (nom, pais, edat)
3ReclamatOwnership aprovat
4BadgeAdmin 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_tier i users.account_type creats 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 (camps subscriptionTier, accountType)
  • Migracio: V65__add_age_verification_and_subscription.sql