Skip to main content
Роль — это набор разрешений: какие объекты приложение может читать или изменять, какие поля оно может видеть и какие возможности платформенного уровня оно может использовать. Функции логики и фронтенд‑компоненты каждого приложения наследуют разрешения роли, помеченной с помощью defineApplicationRole() (см. раздел Роль функции по умолчанию ниже).
src/roles/restricted-company-role.ts

Безопасность на уровне строк

Разрешения на объекты и поля определяют, к каким объектам и полям у роли есть доступ. Предикаты прав доступа на уровне строк заходят дальше и определяют, какие записи роль может видеть и с которыми может работать — например, для роли самообслуживания, где каждый внешний пользователь видит только свои собственные записи. Объявляйте предикаты с помощью rowLevelPermissionPredicates в роли. Как и остальная часть манифеста, каждый предикат имеет свой собственный universalIdentifier и ссылается на объект и поле по их universalIdentifier, operand, а также (необязательно) поле workspaceMember, значение которого подставляется во время выполнения запроса — чтобы вы могли выразить: “отношение владельца записи является текущим участником рабочей области”:
src/roles/partner-role.ts
Поскольку предикаты поставляются в манифесте, они создаются, обновляются и удаляются вместе с ролью при каждой установке и обновлении — не требуется отдельный шаг после установки для поддержания синхронизации.

Комбинирование предикатов с группами

По умолчанию предикаты роли комбинируются с помощью AND. Чтобы комбинировать некоторые из них с помощью OR (или вкладывать логику), объявите запись rowLevelPermissionPredicateGroups и укажите на неё каждый предикат через predicateGroupUniversalIdentifier. Эта роль позволяет партнёру видеть сделку, которая либо принадлежит ему, либо по которой он является контактным лицом:
src/roles/partner-opportunities-role.ts
Заметки:
  • Присвойте каждому предикату и группе стабильный universalIdentifier (любой uuid) — он служит ключом сущности между обновлениями, а предикаты ссылаются на группы по нему.
  • Предикаты могут ссылаться на объекты и поля, принадлежащие вашему приложению, или на стандартные объекты и поля Twenty.
  • Безопасность на уровне строк (row-level security) применяется для рабочих пространств в тарифах, которые её включают; предикаты по-прежнему синхронизируются в других тарифах, они просто не применяются.

Роль функции по умолчанию

Когда вы создаёте новое приложение с помощью шаблона, CLI создаёт файл роли по умолчанию, объявленный с помощью defineApplicationRole():
src/roles/default-role.ts
defineApplicationRole() — это тонкая обёртка вокруг defineRole(), которая помечает ту роль, которая используется как роль приложения по умолчанию во время установки. Проверка идентична defineRole, но конвейер сборки автоматически подключает его universalIdentifier к полю defaultRoleUniversalIdentifier манифеста приложения — поэтому вам не нужно ссылаться на него из defineApplication самостоятельно. Заметки:
  • Допускается ровно один вызов defineApplicationRole(...) на приложение — сборка манифеста завершится с ошибкой, если будет найдено более одного.
  • Используйте defineRole() (а не defineApplicationRole()) для любых дополнительных ролей, которые ставятся вместе с вашим приложением.
  • Явная установка defaultRoleUniversalIdentifier в defineApplication() всё ещё поддерживается для обратной совместимости, но считается устаревшей по сравнению с defineApplicationRole().

Лучшие практики

  • Начните с сгенерированной роли и постепенно ограничивайте её — роль по умолчанию предоставляет широкий доступ на чтение, что редко подходит для продакшена.
  • Замените objectPermissions и fieldPermissions на точные объекты и поля, которые действительно нужны вашим функциям.
  • permissionFlagUniversalIdentifiers управляют доступом к возможностям на уровне платформы. Сведите их к минимуму.
  • См. рабочий пример: hello-world/src/roles/function-role.ts.