Saltar al contenido principal
Un rol es un conjunto de permisos: qué objetos puede leer o escribir una aplicación, qué campos puede ver y qué capacidades a nivel de plataforma puede usar. Las funciones lógicas y los componentes de interfaz de cada aplicación heredan los permisos del rol marcado con defineApplicationRole() (consulta El rol de función predeterminado más abajo).
src/roles/restricted-company-role.ts

Seguridad a nivel de fila

Los permisos de objetos y campos determinan a qué objetos y campos puede acceder o modificar un rol. Los predicados de permisos a nivel de fila van más allá y deciden qué registros puede ver y sobre los que puede actuar un rol; por ejemplo, un rol de autoservicio en el que cada usuario externo ve solo sus propios registros. Declara los predicados con rowLevelPermissionPredicates en el rol. Como el resto del manifiesto, cada predicado tiene su propio universalIdentifier y hace referencia a un objeto y a un campo mediante su universalIdentifier, a un operand y, de forma opcional, a un campo workspaceMember cuyo valor se inyecta en tiempo de consulta, de modo que puedas expresar: “la relación de propietario del registro es el miembro actual del espacio de trabajo”:
src/roles/partner-role.ts
Debido a que los predicados se envían en el manifiesto, se crean, actualizan y eliminan junto con el rol en cada instalación y actualización; no hay ningún paso posterior a la instalación independiente que mantener sincronizado.

Combinar predicados con grupos

De forma predeterminada, los predicados de un rol se combinan con AND. Para combinar algunos de ellos con OR (o para anidar lógica), declara una entrada rowLevelPermissionPredicateGroups y haz que cada predicado apunte a ella mediante predicateGroupUniversalIdentifier. Este rol permite que un socio vea una Oportunidad de la que es propietario o de la que es el punto de contacto:
src/roles/partner-opportunities-role.ts
Notas:
  • Asigna a cada predicado y grupo un universalIdentifier estable (cualquier uuid): sirve como clave de la entidad a través de las actualizaciones, y los predicados hacen referencia a los grupos mediante él.
  • Los predicados pueden hacer referencia a objetos y campos que sean propiedad de tu aplicación o de los objetos estándar de Twenty.
  • La seguridad a nivel de fila se aplica para los espacios de trabajo en planes que la incluyen; los predicados siguen sincronizándose en otros planes, simplemente no se aplican.

El rol de función predeterminado

Cuando generas una nueva aplicación, la CLI crea un archivo de rol predeterminado declarado con defineApplicationRole():
src/roles/default-role.ts
defineApplicationRole() es una envoltura ligera alrededor de defineRole() que marca el rol utilizado como predeterminado de tu aplicación en el momento de la instalación. La validación es idéntica a defineRole, pero la canalización de compilación conecta automáticamente su universalIdentifier con defaultRoleUniversalIdentifier del manifiesto de la aplicación, por lo que no necesitas hacer referencia a él desde defineApplication. Notas:
  • Se permite exactamente una llamada a defineApplicationRole(...) por aplicación; la compilación del manifiesto fallará si encuentra más de una.
  • Usa defineRole() (no defineApplicationRole()) para cualquier rol adicional que distribuya tu aplicación.
  • Configurar defaultRoleUniversalIdentifier explícitamente en defineApplication() sigue siendo compatible por motivos de retrocompatibilidad, pero está en desuso en favor de defineApplicationRole().

Mejores prácticas

  • Parte del rol generado automáticamente y luego restríngeelo progresivamente; el valor predeterminado concede un acceso amplio de lectura, lo cual rara vez es lo que quieres en producción.
  • Reemplaza objectPermissions y fieldPermissions con los objetos y campos que realmente necesitan tus funciones.
  • permissionFlagUniversalIdentifiers controla el acceso a capacidades a nivel de plataforma. Manténlos al mínimo.
  • Consulta un ejemplo funcional: hello-world/src/roles/function-role.ts.