← Arquitectura por épica

FT-USR-02 · Matriz de roles y permisos por módulo, acción, negocio y…

Arquitectura del Nuevo PIM por épica · corte del 18-oct-2026

Propuesta del TL: no sustituye la spec de cada épica

Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.

Qué responde. Cómo funciona por dentro FT-USR-02: qué piezas participan, en qué orden hablan, qué APIs hay que construir con su request y su response, y qué le entrega a la épica siguiente.

Para quién. Los equipos que van a construir la épica, QA y arquitectura.

Estado. [Propuesta] del TL del Nuevo PIM, 18-oct-2026, construida sobre ADR-12. La spec de cada épica dice el qué; estas páginas, el cómo.

Fuente. docs/arquitectura/por-epica/epicas/FT-USR-02.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-USR-02-matriz-de-roles-y-permisos.md.

En 30 segundos

Hoy cada sistema decide los permisos a su manera: el portal los tiene escritos en su código y casi ningún servicio los revisa. Esta épica carga como configuración la matriz de roles firmada por Seguridad y Gobierno de Producto. MS-13 guarda los roles, sus pantallas y quién tiene cada uno, con su negocio y sus secciones; cada módulo guarda qué puede hacer cada rol sobre sus datos y decide él mismo; el BFF arma el menú, y cada intento negado queda en la bitácora.

  • Módulo dueño: MS-13 Identidad y acceso. También participan: MS-01 Catálogo, MS-02 Producto, MS-14 Avisos y ayuda, MS-05 Auditoría.
  • Etapa T · Transversal. Recibe «PE-C · Catálogo vigente» y entrega «PE-T · Usuario con permisos y bitácora».
  • APIs: construye 6 y usa 15 que construyen otras épicas.
  • Eventos: publica 2 y consume 2.

1. Dónde encaja

Recibe

DeQué
FT-USR-01 · Identidad y autenticación de usuarios internos…Los usuarios del directorio con su tipo, negocios, proveedor o seller, áreas y secciones.
PE-C · Catálogo vigenteLas secciones con sus grupos de artículo vigentes en MS-01, que las membresías citan como alcance.
FT-PLT-04 · Grupos de atributos y mínimos de información por sistema…Los grupos de atributos de tipo permiso (qué atributos van juntos), que la hoja del motor cita para decir qué rol ve o edita cada grupo.

Entrega

AQué
PE-T · Usuario con permisos y bitácoraCada módulo sabe qué roles tiene quien llama, con su negocio, sección y vigencia, y decide con su propia tabla; lo negado responde 403 y queda en MS-05.
FT-USR-01 · Identidad y autenticación de usuarios internos…El catálogo de roles y áreas, con las pantallas de cada uno, que la sesión devuelve.
FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…Los roles y áreas que cita la tabla ROLE_MATRIX del motor, y quién integra cada uno para llenar las colas.
FT-PLT-01 · Fundamentos de gobierno de plantillasLos roles que cita la hoja de permisos del catálogo: quién consulta, propone, aprueba o captura un ID.
FT-CAT-01 · Administración del árbol de categorías webLos roles de Category con los que MS-01 decide quién crea, mueve, desliga y aprueba categorías.
FT-PRD-05 · Edición y aprobación por campo según el dueño del datoLos roles y áreas con los que el motor expresa el dueño de cada grupo de campos.
FT-USR-03 · Control de acceso por API para tercerosLos roles de administración de terceros (PARTNER-ADMIN) y del administrador de cada tercero.

2. Diagrama de contexto

Quién participa y cómo se conecta. Las pantallas llegan por el BFF del portal, que valida el token y compone; cada módulo vuelve a validar el token y decide sus permisos con los roles de MS-13.

🟩 Verde: nuevo, se construye · 🟦 Azul: ya existe y se queda, se reutiliza su código · 🟧 Naranja: temporal o se retira (se apaga en R3) · ⬜ Gris: sistema externo · ★ módulo dueño

Nuevo PIM · un solo sistema

Pantallas y sistemas

Personas

Sesión y menú

Cargar la hoja de roles de la matriz…
Confirmar un plan de identidad
y 1 más

ROLE_CHANGED
USER_CHANGED

Cambiar la configuración del motor
Confirmar un plan de Producto
y 3 más

Roles y áreas
Roles efectivos de quien llama
y 1 más

ROLE_CHANGED

Intentos negados y eventos de segurid…

Quién integra un rol o un área

Selector de plantillas
Plan de alta o cambio de atributos
y 2 más

Responde sólo los productos de ese se…

Roles efectivos de quien llama

Intentos negados y eventos de segurid…

bitácora

Administración del catálogo

Compras

Seller

Entrada Única · Vendor Center

BFF del portal

★ MS-13 Identidad y acceso

MS-01 Catálogo

MS-02 Producto

MS-14 Avisos y ayuda

MS-05 Auditoría

Eventos

Contexto de FT-USR-02

3. Diagrama de flujo

El camino principal, paso por paso. Cuando una pantalla llama a un módulo se ven dos flechas: la pantalla al BFF y el BFF al módulo. Los eventos salen del outbox del módulo después de guardar; quien los consume ignora los repetidos.

MS-05 AuditoríaMS-02 ProductoEventosMS-13 Identidad y accesoEntrada Única · Vendor CenterMS-05 AuditoríaMS-02 ProductoEventosMS-13 Identidad y accesoEntrada Única · Vendor CenterAdministración del catálogoBFFCompras1. Sube la hoja de roles de la matriz firmada2. Pide el plan de roles y pantallas, sin escribirPOST /api/v2/roles/matrix/plans3. Confirma los rolesPOST /api/v2/identity-plans/{planId}/apply4. Avisa el cambio de rolesROLE_CHANGED5. Sube la hoja de permisos del motor6. Pide el plan de la tabla ROLE_MATRIXPOST /api/v2/workflow/config/{type}/plans7. Revisa que cada rol citado existaGET /api/v2/roles8. Confirma la tabla del motorPOST /api/v2/product-plans/{planId}/apply9. Entrega el cambio para rehacer los menúsROLE_CHANGED10. Intenta aceptar una propuesta sin ese permiso11. Pide el plan de la acción ACCEPTPOST /api/v2/workflow/actions/plans12. Pide los roles efectivos del compradorGET /internal/identity/permissions?userId=13. Responde 403 y registra el intento negadoPOST /internal/audit/security-eventsAdministración del catálogoBFFCompras
Flujo principal de FT-USR-02
Los pasos en texto
PasoDeAQué haceAPI o evento
1Administración del catálogoEntrada Única · Vendor CenterSube la hoja de roles de la matriz firmada—
2Entrada Única · Vendor CenterMS-13 Identidad y acceso (por el BFF)Pide el plan de roles y pantallas, sin escribirAPI-13-013
3Entrada Única · Vendor CenterMS-13 Identidad y acceso (por el BFF)Confirma los rolesAPI-13-007
4MS-13 Identidad y accesoEventosAvisa el cambio de rolescatalog.identity.changed/ROLE_CHANGED
5Administración del catálogoEntrada Única · Vendor CenterSube la hoja de permisos del motor—
6Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Pide el plan de la tabla ROLE_MATRIXAPI-02-031
7MS-02 ProductoMS-13 Identidad y accesoRevisa que cada rol citado existaAPI-13-005
8Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Confirma la tabla del motorAPI-02-057
9EventosBFF del portalEntrega el cambio para rehacer los menúscatalog.identity.changed/ROLE_CHANGED
10ComprasEntrada Única · Vendor CenterIntenta aceptar una propuesta sin ese permiso—
11Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Pide el plan de la acción ACCEPTAPI-02-028
12MS-02 ProductoMS-13 Identidad y accesoPide los roles efectivos del compradorAPI-13-001
13MS-02 ProductoMS-05 AuditoríaResponde 403 y registra el intento negadoAPI-05-007

3.1 Asignar personas, secciones y pasos

MS-05 AuditoríaMS-01 CatálogoMS-14 Avisos y ayudaMS-02 ProductoEventosMS-13 Identidad y accesoEntrada Única · Vendor CenterMS-05 AuditoríaMS-01 CatálogoMS-14 Avisos y ayudaMS-02 ProductoEventosMS-13 Identidad y accesoEntrada Única · Vendor CenterAdministración del catálogoBFFCompras1. Liga a un analista al rol QA en la sección 20012. Pide el plan de las membresíasPOST /api/v2/users/plans3. Confirma las membresíasPOST /api/v2/identity-plans/{planId}/apply4. Avisa el cambio del usuarioUSER_CHANGED5. Pregunta quién integra QA para la colaGET /internal/identity/groups/{code}/members6. Pregunta a quién avisar de la tarea nuevaGET /internal/identity/groups/{code}/members7. Elige la sección al capturar una propuesta8. Ve sólo las secciones ligadas a su usuarioGET /bff/v1/session9. Trae los grupos de artículo de esa secciónGET /api/v2/structures/{id}/leaves10. Rechaza un alta fuera de su sección y lo registraPOST /internal/audit/security-eventsAdministración del catálogoBFFCompras
Asignar personas, secciones y pasos

3.2 Cada quien ve sólo lo suyo

MS-05 AuditoríaMS-13 Identidad y accesoMS-02 ProductoEntrada Única · Vendor CenterMS-05 AuditoríaMS-13 Identidad y accesoMS-02 ProductoEntrada Única · Vendor CenterSellerBFF1. Busca sus productos2. Pide la búsquedaPOST /api/v2/products/search3. Pide el seller del usuario y sus negociosGET /internal/identity/permissions?userId=4. Responde sólo los productos de ese seller5. Abre la liga de un producto de otro seller6. Pide la ficha del productoGET /api/v2/products/{id}7. Responde 404 y registra el intentoPOST /internal/audit/security-eventsSellerBFF
Cada quien ve sólo lo suyo

3.3 Sólo perfiles autorizados cambian el catálogo

MS-05 AuditoríaMS-13 Identidad y accesoMS-01 CatálogoEntrada Única · Vendor CenterMS-05 AuditoríaMS-13 Identidad y accesoMS-01 CatálogoEntrada Única · Vendor CenterComprasBFFAdministración del catálogo1. Intenta crear un atributo global2. Pide el plan del atributoPOST /api/v2/attributes/plans3. Pide los roles de quien llamaGET /internal/identity/permissions?userId=4. Responde 403 y registra el intentoPOST /internal/audit/security-events5. Carga la hoja de permisos del catálogo6. Pide el plan de permisos del catálogoPOST /api/v2/catalog-permissions/plans7. Confirma el planPOST /api/v2/catalog-plans/{planId}/applyComprasBFFAdministración del catálogo
Sólo perfiles autorizados cambian el catálogo

4. Si algo sale mal

  • La hoja de roles cita una pantalla que no existe o retira un rol con miembros vigentes. El plan responde 422 con el renglón y el motivo; no se escribe nada hasta corregir la hoja o mover a los miembros.
  • Una hoja de dominio cita un rol que no existe en el directorio. Su dueño (el motor de MS-02 o MS-01) rechaza ese renglón en la vista previa; Administración de accesos da de alta el rol primero.
  • Alguien sin permiso intenta una acción. Recibe 403 AUTHORIZATION_ERROR, o 404 si el objeto es de otro proveedor o seller; el intento queda en MS-05 con la acción y el motivo, y Administración de accesos lo ve en el historial.
  • Se pierde o se atrasa el aviso ROLE_CHANGED. La caché vence sola a los 5 minutos; cada respuesta de roles lleva su versión, así se sabe con cuál se decidió.
  • La matriz firmada no llega antes de la UAT. Se arranca con el catálogo inicial traducido de los perfiles de hoy, marcado como provisional; lo que no conceda queda negado y Gobierno de Producto ve la lista de lo pendiente.

5. APIs

Las que construye esta épica (6)

POST /api/v2/roles/matrix/plans · Cargar la hoja de roles de la matriz firmada
CampoValor
APIAPI-13-013 · MS-13 Identidad y acceso
Para quéRecibe la hoja de roles de la matriz firmada por Seguridad y Gobierno de Producto (roles y áreas, pantallas de cada uno y alcance que piden), la compara con la vigente y dice qué nace, cambia o se retira y a cuántos usuarios afecta, sin escribir todavía. Las hojas de permisos de dominio se cargan en su dueño.
En esta épicaCargar con vista previa la hoja de roles de la matriz firmada
Quién la llamaBFF del portal
PermisoACCESS-ADMIN
CabecerasAuthorization, X-Request-Id, Idempotency-Key

Request

{
  "file": "(hoja ROLES de la matriz, XLSX en multipart)",
  "matrixVersion": 8,
  "signedBy": [
    "SEGURIDAD",
    "GOBIERNO_PRODUCTO"
  ],
  "signedOn": "2026-11-20",
  "effectiveFrom": "2026-12-01T06:00:00Z"
}

Response · 200

{
  "success": true,
  "data": {
    "planId": "pln-c71d03",
    "expiresAt": "2026-11-20T18:30:00Z",
    "summary": {
      "roles": 41,
      "new": 3,
      "changed": 12,
      "retired": 2,
      "usersAffected": 46
    },
    "items": [
      {
        "roleId": "EJECUTIVO_CATALOGACION",
        "change": "NEW",
        "screens": [
          "PROPUESTAS",
          "LOOKS"
        ]
      },
      {
        "roleId": "PIM_CATALOG_ADMIN",
        "change": "RETIRED",
        "membersToMove": 0
      }
    ],
    "rejectedRows": [],
    "domainSheets": [
      {
        "sheet": "MOTOR",
        "owner": "MS-02",
        "loadWith": "API-02-031 (ROLE_MATRIX y FIELD_OWNERS)"
      },
      {
        "sheet": "CATALOGO",
        "owner": "MS-01",
        "loadWith": "permisos del catálogo de MS-01"
      }
    ],
    "applyUrl": "/api/v2/identity-plans/pln-c71d03/apply"
  }
}

Errores

HTTPCódigoCuándo
422VALIDATION_ERRORUn renglón cita una pantalla que no existe o retira un rol con miembros vigentes
422UNKNOWN_COLUMNLa hoja trae una columna ajena; se rechaza completa
409VERSION_CONFLICTLa hoja vigente cambió desde que se descargó
GET /api/v2/roles/matrix · Descargar la hoja de roles vigente
CampoValor
APIAPI-13-014 · MS-13 Identidad y acceso
Para quéEntrega la hoja de roles vigente (roles, áreas, pantallas, alcance y miembros) con su versión, quién la firmó y desde cuándo vale, para revisarla y volverla a firmar.
En esta épicaDescargar la hoja de roles vigente para revisarla y firmarla
Quién la llamaBFF del portal
PermisoACCESS-ADMIN
CabecerasAuthorization, X-Request-Id
Parámetrosformat = JSON

Request

null

Response · 200

{
  "success": true,
  "data": {
    "matrixVersion": 7,
    "effectiveFrom": "2026-10-01T06:00:00Z",
    "signedBy": [
      "SEGURIDAD",
      "GOBIERNO_PRODUCTO"
    ],
    "rows": [
      {
        "roleId": "COMPRAS",
        "kind": "ROLE",
        "name": "Compras",
        "screens": [
          "BANDEJA_VISTO_BUENO",
          "PROPUESTAS",
          "TABLEROS"
        ],
        "scopeTypes": [
          "businesses",
          "sections",
          "areas"
        ],
        "members": 214
      },
      {
        "roleId": "COMPRAS-HOGAR",
        "kind": "AREA",
        "name": "Compras Hogar",
        "screens": [],
        "scopeTypes": [],
        "members": 31
      }
    ]
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERRORQuien pide no tiene ACCESS-ADMIN
GET /api/v2/roles · Roles y áreas
CampoValor
APIAPI-13-005 · MS-13 Identidad y acceso
Para quéLista los roles y áreas vigentes: nombre, pantallas que ven, qué alcance piden (negocio, sección, proveedor o seller), cuántos usuarios tienen y de qué versión de la matriz salen. Los módulos dueños lo consultan para validar los roles que citan sus tablas de permisos.
En esta épicaConsultar roles y áreas; los dueños validan los roles que citan
Quién la llamaBFF del portal, MS-01 Catálogo, MS-02 Producto
PermisoACCESS-ADMIN; las cuentas de servicio de MS-01 y MS-02
CabecerasAuthorization, X-Request-Id
Parámetrosstatus = ACTIVE, kind = ROLE, q = QA
También la usanFT-PLT-01

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "roleId": "QA",
        "kind": "ROLE",
        "name": "QA de contenido",
        "status": "ACTIVE",
        "members": 23,
        "matrixVersion": 7,
        "screens": [
          "BANDEJA_QA",
          "TABLEROS",
          "MIS_EXPORTES"
        ],
        "scopeTypes": [
          "businesses",
          "sections"
        ]
      }
    ],
    "page": 1,
    "size": 50,
    "total": 1
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERRORQuien pide no tiene ACCESS-ADMIN ni es un módulo dueño
POST /api/v2/roles/plans · Preparar el cambio de un rol
CampoValor
APIAPI-13-006 · MS-13 Identidad y acceso
Para quéPrepara el alta, el cambio o el retiro de un solo rol o área (nombre, pantallas y alcance que pide) y dice a cuántos usuarios afecta, sin escribir todavía. Para cambiar muchos a la vez se carga la hoja de roles de la matriz firmada.
En esta épicaCrear, cambiar o retirar un solo rol
Quién la llamaBFF del portal
PermisoACCESS-ADMIN
CabecerasAuthorization, X-Request-Id, Idempotency-Key, If-Match

Request

{
  "operation": "CREATE",
  "roleId": "EJECUTIVO_CATALOGACION",
  "name": "Ejecutivo de catalogación",
  "screens": [
    "PROPUESTAS",
    "LOOKS"
  ],
  "scopeTypes": [
    "businesses"
  ],
  "reason": "La matriz firmada crea el rol que lleva un Conjunto Look a Publicación"
}

Response · 200

{
  "success": true,
  "data": {
    "planId": "pln-0e7b52",
    "expiresAt": "2026-10-18T15:14:05Z",
    "impact": {
      "users": 0,
      "screensAdded": [
        "LOOKS"
      ],
      "screensRemoved": []
    },
    "applyUrl": "/api/v2/identity-plans/pln-0e7b52/apply"
  }
}

Errores

HTTPCódigoCuándo
422VALIDATION_ERRORUna pantalla no existe en el portal o el rol ya existe
422BUSINESS_ERRORSe retira un rol que todavía tiene miembros vigentes
409VERSION_CONFLICTEl rol cambió desde que se leyó
GET /internal/identity/groups/{code}/members · Quién integra un rol o un área
CampoValor
APIAPI-13-015 · MS-13 Identidad y acceso
Para quéDice quién integra hoy un rol o un área, para un negocio y una sección, para que el motor de tareas llene la cola y los avisos lleguen a quien le toca.
En esta épicaSaber quién integra un rol o un área para colas y avisos
Quién la llamaMS-02 Producto, MS-14 Avisos y ayuda
PermisoSólo las cuentas de servicio de MS-02 y MS-14
CabecerasAuthorization, X-Request-Id
Parámetroscode = QA, business = MER, section = 2001

Request

null

Response · 200

{
  "success": true,
  "data": {
    "code": "QA",
    "kind": "ROLE",
    "business": "MER",
    "section": "2001",
    "members": [
      {
        "userId": "USR-000318",
        "displayName": "Analista QA 07",
        "contact": "(correo del directorio)",
        "validTo": "2027-10-31T23:59:59Z"
      }
    ],
    "total": 1
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDEl rol o el área no existen
POST /internal/audit/security-events · Intentos negados y eventos de seguridad
CampoValor
APIAPI-05-007 · MS-05 Auditoría
Para quéCada módulo, el BFF y el gateway mandan por lotes los intentos negados (403), los intentos de cambiar o borrar la bitácora y las cabeceras de identidad que no debían llegar. MS-05 los guarda para el historial de accesos.
En esta épicaRegistrar cada intento negado
Quién la llamaMS-01 Catálogo, MS-02 Producto, MS-04 Reportes, MS-05 Auditoría, MS-06 Evaluación, MS-11 Activos digitales, MS-12 Estudio fotográfico, MS-13 Identidad y acceso, MS-14 Avisos y ayuda, MS-15 IA y enriquecimiento, BFF del portal, Gateway de terceros /partner/v1
PermisoSólo cuentas de servicio del PIM
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Escribe enaudit_events
También la usanFT-ARQ-02

Request

{
  "source": "MS-02",
  "events": [
    {
      "type": "ACCESS_DENIED",
      "at": "2026-10-17T22:31:40Z",
      "subject": "idp|8b30fe21aa",
      "userId": "USR-000318",
      "action": "FLU-ACCEPT",
      "resource": {
        "type": "PRODUCT",
        "id": "PRD-0004812"
      },
      "reason": "SIN_CAPACIDAD",
      "requestId": "req-77ab10"
    }
  ]
}

Response · 202

{
  "success": true,
  "data": {
    "accepted": 1
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERRORNo llama una cuenta de servicio del PIM
422VALIDATION_ERROREl lote pasa de 500 eventos o un evento no trae tipo

Las que usa y construye otra épica (15)

Su request y su response están en la página de la épica que la construye.

APIMétodo y rutaPara qué, aquíLa construye
API-13-007POST /api/v2/identity-plans/{planId}/applyConfirmar los planes de roles y membresíasFT-USR-01 · Identidad y autenticación de usuarios internos…
API-13-004POST /api/v2/users/plansCambiar membresías con alcance y vigenciaFT-USR-01 · Identidad y autenticación de usuarios internos…
API-13-001GET /internal/identity/permissions?userId=Los roles efectivos con los que decide cada móduloFT-USR-01 · Identidad y autenticación de usuarios internos…
API-BFF-503GET /bff/v1/sessionLa sesión con las secciones y pantallas del usuarioFT-USR-01 · Identidad y autenticación de usuarios internos…
API-02-031POST /api/v2/workflow/config/{type}/plansCargar la hoja del motor: ROLE_MATRIX y FIELD_OWNERSFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-030GET /api/v2/workflow/config/{type}Leer la tabla de permisos del motor vigenteFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-057POST /api/v2/product-plans/{planId}/applyConfirmar el plan de la tabla del motorFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-028POST /api/v2/workflow/actions/plansEjemplo de acción negada por la tabla del motorFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-027GET /api/v2/workflow/capabilities?productIds=Qué grupos de campos puede editar quien llama en un productoFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-001POST /api/v2/products/searchBúsqueda filtrada por el proveedor o seller del usuarioFT-PRD-01 · Modelo canónico de producto
API-02-002GET /api/v2/products/{id}Ficha que responde 404 si el producto es de otro sellerFT-PRD-01 · Modelo canónico de producto
API-01-003POST /api/v2/attributes/plansEjemplo de cambio al catálogo que decide MS-01FT-PLT-02 · Catálogo de atributos
API-01-004POST /api/v2/catalog-plans/{planId}/applyConfirmar el plan de permisos del catálogoFT-PLT-01 · Fundamentos de gobierno de plantillas
API-01-022GET /api/v2/structures/{id}/leavesLos grupos de artículo de una secciónFT-PLT-05 · Taxonomía de plantillas por familia, metadatos de…
API-01-110POST /api/v2/catalog-permissions/plansCargar la hoja de permisos del catálogo en MS-01FT-PLT-01 · Fundamentos de gobierno de plantillas

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.identity.changed/ROLE_CHANGEDNace, cambia o se retira un rol o un área, o se carga la hoja de rolesFT-ARQ-02, FT-FLU-01
catalog.identity.changed/USER_CHANGEDCambian las membresías, el alcance o la vigencia de un usuarioFT-PRD-06, FT-USR-01

Consume

EventoPara quéQuién lo publica
catalog.identity.changed/ROLE_CHANGEDEl BFF rehace los menús; MS-01 y MS-02 vacían su caché y revisan los roles que citan sus tablas; MS-05 lo guardaesta misma épica
catalog.identity.changed/USER_CHANGEDMS-02 regresa a la bolsa las tareas de quien dejó un rol o un área y los módulos vacían su cachéesta misma épica

7. Datos

Cada colección tiene un solo dueño, el único que escribe en ella.

ColecciónDueñoQué guardaEsta épica
rolesMS-13Perfiles y roles, con sus membresías y su alcance (negocio, sección, proveedor o seller, vigencia). Los permisos de dominio los decide el servicio dueño con estos roles (decisión 19).escribe
usersMS-13Cada usuario interno, proveedor o seller, su liga con el proveedor de identidad y sus roles.escribe
identity_outboxMS-13Los cambios de identidad que esperan salir como evento.escribe
identity_receiptsMS-13Los planes de identidad por confirmar (vencen a los 10 minutos) y el recibo de cada cambio confirmado de usuarios, roles y terceros, con lo que respondió el proveedor de identidad.escribe
audit_eventsMS-05Quién cambió qué, cuándo, desde dónde, con el antes y el después.escribe
usersMS-13Cada usuario interno, proveedor o seller, su liga con el proveedor de identidad y sus roles.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-USR-02·H1 · Cargar la matriz firmada como configuraciónP1pasos 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13; API-13-013, API-13-014, API-02-031, API-05-007
FT-USR-02·H2 · Que sólo perfiles autorizados toquen la estructura global de atributos, las…P1flujo «Sólo perfiles autorizados cambian el catálogo»; API-01-110, API-01-003
FT-USR-02·H3 · Que el EAN sólo lo cambien Gobierno de Datos o el flujo de liberación, y que…P1API-13-006, API-02-030. Fuera: Las acciones de cambiar un EAN y de llevar un Conjunto Look a Publicación son del motor de MS-02 y las construyen sus épicas (FT-PRD-03 para el EAN); aquí se crea el rol Ejecutivo de catalogación y se fija quién tiene cada acción (D-USR-02-8).
FT-USR-02·H4 · Editar directamente los campos de los que soy dueño y que lo demás pase por…P2API-02-027, API-02-030. Fuera: Qué cambio va directo y cuál pasa a aprobación lo resuelve FT-PRD-05 con FIELD_OWNERS del motor; aquí sólo se fija que el dueño de cada grupo de campos se expresa con roles y áreas del directorio.
FT-USR-02·H5 · Ver y editar sólo mis productosP2flujo «Cada quien ve sólo lo suyo»; API-13-001
FT-USR-02·H6 · Asignar usuarios o grupos a cada pasoP2flujo «Asignar personas, secciones y pasos»; API-13-015, API-13-004
FT-USR-02·H7 · Catalogar sólo en mis seccionesP1flujo «Asignar personas, secciones y pasos»; API-01-022, API-05-007

9. Decisiones de esta épica

Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.

  • D-USR-02-1. Cada parte de la matriz tiene un dueño y nada se repite. MS-13 guarda los roles y áreas, las pantallas de cada rol y las membresías con su alcance (negocio, sección, proveedor o seller, área) y su vigencia. El motor de MS-02 guarda rol × acción × tarea × negocio (ROLE_MATRIX) y el dueño de cada grupo de campos (FIELD_OWNERS); MS-01, rol × acción sobre el catálogo; MS-04 y MS-05, qué rol usa cada reporte y cada consulta de la bitácora. MS-13 no guarda permisos de dominio. Por qué: La decisión 18 pone el rol en el directorio y la matriz en el servicio dueño, y el motor ya la tomó así; si MS-13 guardara también acciones, habría dos tablas que reconciliar. Se apoya en DUD-22, DMS-71, DEC-PLT-09, FT-FLU-01.
  • D-USR-02-2. La matriz firmada es un documento con una hoja por dueño: ROLES (MS-13), MOTOR (MS-02) y CATALOGO (MS-01). Cada hoja se carga con vista previa en su dueño, que valida contra MS-13 que los roles existan. Un perfil nuevo es una fila en ROLES y en las hojas que toque: no se despliega nada; sólo una pantalla o una acción nueva piden código. Por qué: Se aplican permisos sin cambiar código (H1) y cada dueño sigue siendo el único que escribe su tabla. Se apoya en DUD-22, DEC-PLT-09.
  • D-USR-02-3. Falla cerrada: lo que una hoja no conceda está negado. Cada negación responde 403 AUTHORIZATION_ERROR (404 si revelaría que existe un objeto de otro proveedor o seller) y el módulo la manda a MS-05 por lotes (API-05-007) con la acción, el objeto y el motivo. Por qué: Sin matriz no se supone ningún permiso, y el intento negado tiene que quedar registrado, como piden H1 y H7. Se apoya en ADR-05, DUD-22.
  • D-USR-02-4. Arranque: un catálogo inicial de roles traducido de los 15 perfiles de Entrada Única, los 15 perfiles y 19 roles de Foro, los grupos de workflow de P360 (sólo cuentan las membresías de tipo 2700) y los 8 roles que nombran las ERF. Las 26 autorizaciones concedidas de P360 son insumo y no se migran. Queda marcado como provisional hasta la firma. Por qué: El taller de la matriz necesita un punto de partida medido, y P360 es insumo, no fuente. Se apoya en DEC-PLT-09, DUD-22.
  • D-USR-02-5. El aislamiento se hace en el servidor: MS-02 filtra búsquedas, fichas, exportes y la API de terceros por el proveedor o seller que da API-13-001; un producto ajeno responde 404. Los sellers entran en la fase que fije PD-02. Por qué: Hoy el portal marca a todo usuario como autorizado; filtrar en el navegador no protege nada. Se apoya en PD-02, RSG-36.
  • D-USR-02-6. Las secciones van en el alcance de cada membresía. Las pantallas sólo ofrecen esas secciones y los grupos de artículo de cada una (MS-01), y MS-02 rechaza crear o aprobar fuera de ellas, también por API, con 403 y registro. Por qué: Así el filtro por sección vale igual en la pantalla, en la carga masiva y en la API. Se apoya en DUD-22.
  • D-USR-02-7. El motor asigna cada tarea a un rol o un área (configuración de MS-02) y MS-13 dice quién lo integra hoy (API-13-015), para la cola y para los avisos. Asignar a alguien a un paso es cambiar su membresía, no el código. Por qué: Cada workflow de P360 tenía su grupo; aquí el grupo es un rol del directorio y la regla del paso vive en el motor. Se apoya en PEN-60, PD-29.
  • D-USR-02-8. Cambiar un EAN fuera del flujo de liberación queda en la tabla del motor sólo para Gobierno de Datos, y llevar un Conjunto Look a Publicación sólo para el rol nuevo Ejecutivo de catalogación, que se crea en la hoja de roles porque hoy no existe en código. Por qué: Lo piden las ERF y ningún sistema lo controla hoy. Se apoya en DUD-22.
  • D-USR-02-9. Cada rol lleva sus pantallas en el directorio y el BFF las aplica en el menú y en cada ruta /bff; se quitan las guardas escritas en el front. Por qué: El BFF no tiene base; si las pantallas fueran código del BFF, un perfil nuevo pediría un despliegue. Se apoya en PD-30, DUD-22.

Qué falta decidir

IDQué falta
DUD-22Negocio con Seguridad firma la matriz (las tres hojas) en un taller antes del 27-nov; aquí se fija el marco y el arranque provisional.
PD-02Dirección y PM fijan si los sellers entran en la Fase 1; de eso depende cuándo se prueba su aislamiento.

También siguen abiertos: PEN-60, Negocio define en qué casos se abre la tarea de Gobierno de Datos tras crear el SKU y para quién (propuesta en D-RAC-04-4); PEN-55, Negocio confirma cómo se identifica el negocio de cada alta de un proveedor híbrido.

Fuentes

  1. [D] trazabilidad/features/FT-USR-02-matriz-de-roles-y-permisos.md: la ficha de la épica, con sus historias, reglas y bloqueos.
  2. [D] ADR-12 · Un solo sistema: backend compartido y una sola base (sección 3.4).
  3. [D] docs/arquitectura/por-epica/base/: piezas, colecciones, eventos y el hilo de punta a punta.
  4. [D] docs/arquitectura/omega-a-pim-headless/contratos-api.md: convenciones y endpoints de partida.
  5. [D] docs/arquitectura/maquina-de-estados-to-be/propuesta-maquina-de-estados.md §7: estados, tareas y canales.
  6. [I] Las decisiones de la sección 9 son del TL sobre esas fuentes.