Роли пользователей
Что такое и где используются?
Сразу скажем, что это не совсем роли, это скорее что-то вроде списка тегов или аудиторий. Роли используются как обычно для фильтрации доступного функционала.
Они пересчитываются при авторизации и помещаются в 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, нона вход только одна роль