Как сделать (Spatie/Permissions) роль или разрешение доступными (назначаемыми) только для определенного типа учетной записи
Некоторая справочная информация / требования к моему проекту (Laravel 7), необходимые для понимания / ответа на мой вопрос.
- В моем приложении есть учетные записи, которые могут иметь одного или нескольких пользователей (отношение один ко многим)
- У каждой учетной записи есть тип (например, система, организация, клиент).
- Я хочу иметь возможность назначать роли пользователю
- Я хочу иметь возможность назначать разрешения пользователям через роль (только через роль, а не напрямую пользователю)
- Роль должна быть привязана к типу - поэтому ее можно назначать только одному конкретному типу учетной записи.
- Разрешение должно быть назначено всем ролям определенного (т.е. 1 ... *) типа (ов) учетных записей.
Я искал хорошее решение для выполнения требований, описанных выше, и нашел Laravel Spatie Permissions
. Я думаю, что эта библиотека подойдет для решения моей "проблемы", но в ней отсутствуют некоторые функции. Насколько я могу судить, это невозможно:
- Определите роли для определенного типа учетной записи
- Ограничить разрешения для ролей определенного типа (ов) учетной записи
пример
- Роль
admin_default
- Можно
create_system_users
а такжеsee_organizations
- может быть назначен только пользователям учетной записи с типом
system
- Можно
- Роль
customer_default
- Можно
see_organizations
- может быть назначен только пользователям учетной записи с типом
customer
- Можно
- Разрешение
create_system_users
могут быть назначены ролям только для учетных записей с типомsystem
- Разрешение
see_organizations
могут быть назначены ролям для учетных записей с типомsystem
organization
customer
Возможное решение 1.
Я мог бы добавить дополнительный столбец (например, account_type, type: integer) в таблицу ролей, который определяет, какому типу учетной записи присваивается роль. Мне нужно добавить дополнительные проверки к некоторым функциям библиотеки разрешений, напримерasignRole()
а также syncRoles()
.
Возможное решение 2.
Я мог бы добавить дополнительный столбец (например, account_type, type: bitflag) в таблицу разрешений, которая определяет, каким (связанным с типом учетной записи) ролям может быть назначено разрешение.
Поскольку Spatie Permission не поддерживает это по умолчанию, мне нужно добавить функциональность, в основном проверку if для логики существующих функций. Поскольку я не хочу вносить изменения в саму библиотеку, я решил создать классы, наследующиеRole
а также Permission
классы и "наследуют" HasRoles
а также HasPermissions
. Я бы указал наroles
а также permissions
запись в Permission.php
config в мои собственные классы и переопределить use
черт в моих собственных классах с моими собственными чертами (не уверен, возможно ли это / должно ли работать в PHP, но моя логика говорит, что это должно работать, отсутствие знаний PHP)
Мои вопросы
Является Spatie Permissions
правильная библиотека для использования или, может быть, есть лучшее решение "из полки" для решения моей проблемы? (или можетSpatie Permissions
поддерживает это по умолчанию, но я этого не знаю?)
когда Spatie Permissions
"лучший путь", мои Possible solutions
хороший подход? и должно ли это работать? (сейчас, но также и при обновлении библиотеки разрешений, так это на будущее?)
Я тоже могу написать что-нибудь самостоятельно, но я думаю, что это своего рода изобретение колеса заново или?
Примечание: я также думаю о таких вещах, как будущее и масштабируемость.