META

Роли пользователей

Что такое и где используются?

Сразу скажем, что это не совсем роли, это скорее что-то вроде списка тегов или аудиторий. Роли используются как обычно для фильтрации доступного функционала.

Они пересчитываются при авторизации и помещаются в env.roles

Чтобы обновить данные по текущему пользователю мы можете использовать код на meta/js:

CurrentUserService.reload();

Чтобы обновить данные по любому пользователю мы можете использовать код на meta/js:

PubSubService.pubReloadUser(userId);

Какие бывают

Системные роли

  • meta.role.all - все пользователи - с авторизацией и без
  • meta.role.anon - неавторизованные пользователи
  • meta.role.auth - авторизованные пользователи
  • meta.role.dev - разработчики
  • meta.role.support - техническая поддержка
  • meta.role.preset_admin - администратор созраненых фильтров (пресетов) страниц

Динамические роли

Выдаются при авторизации

  • c{COMPANY_ID} - имеют все пользователи, входящие в company. Если надо выдать доступ к чему-то всем пользователям одной компании
  • u{USER_ID} - Если надо выдать доступ к чему-то конкретному пользователю

AdHands роли

Выдается из данных поля users.roles[0]

  • adhands.role.{ADHANDS_ROLE_ID} - у кадого пользователя есть одна роль из-за наследственности от adhands

Пример использования

Для фильтрации данных

Типичный случай использования фильтров данных, который отлично себя зарекомендовал:

AND allowed_roles && ARRAY[ :env.roles ]::text[]

В таблице создается поле allowed_roles text[] и туда по надобности добавляются нужные роли.

Это круто и удобно потому, что:

  • У вас всего одно поле и с ним проще работать и меньше кода
  • Поле можно проиндексировать и опять же оно одно и расширяется очень легко
  • Поиск пересечений в одном поле лучше чем OR на разные поля
  • Добавляя это поле вы перестаете парится вопросами:
    • как ограничить доступ конкретной компании или группе
    • а что если надо добавить еще конкретного пользователя или более одного
    • нужно добавлять группу пользователей, при этоу управление группой - отдельная песня и не является ACL напрямую

Использование в meta/js

Обратите внимание, что в meta/js env является не внутренним объектов меты, а иеент тип Map<String, Object> и для того, чтобы работать с реальным env надо использовать originalEnv:

  • originalEnv.hasRoleAnon() - быстро-фильтр на проверку неавторозованных пользователей
  • originalEnv.hasRoleDev() - быстро-фильтр на проверку пользователей-разработчиков
  • originalEnv.hasRoleSupport() - быстро-фильтр на проверку пользователей-саппорта
  • originalEnv.hasAnyRoles([‘adhands.role.97’, ‘meta.role.dev’]) - поиск пересечений. Вернет true, если в env.roles есть хотябы одна указанная роль
  • originalEnv.hasRole(“meta.role.preset_admin”) - выполняет все то, что и hasAnyRoles, нона вход только одна роль