Как назначить роли и разрешения для пользователя, когда контроль доступа на основе ролей не достаточно?
В приложении Laravel у меня есть users
, roles
а также permissions
, Роли привязаны к пользователям, а разрешения - к ролям.
Пользователи:
id | name | email
______________________
1 | saba | saba@gmail.com
2 | nika | nika@gmail.com
3 | gio | gio@gmail.com
Роли:
id | name
______________________
1 | Admin
2 | Client
3 | Service_provider
Разрешения:
id | name
______________________
1 | add_admin
2 | delete_admin
3 | approve_order
4 | delete_order
User_roles:
id | user_id | role_id
______________________
1 | 1 | 1
2 | 2 | 2
Role_permissions:
id | role_id | permission_id
____________________________
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
В этом примере user
с id
1, это Admin
и он может add_admin
, delete_admin
, approve_order
Но мне нужны разные администраторы, чтобы иметь разные разрешения. В этой структуре, если я присоединяюсь admin
роль в user
с id
2, его разрешения будут такими же, как user
с id
1 имеет.
Мне нужны разные администраторы с разными разрешениями, разные клиенты с разными разрешениями.
Есть небольшой сценарий:
Представьте, что есть два пользователя A и B, которые хотят зарегистрироваться как клиенты, поэтому, когда они регистрируются, я прикрепляю к ним роли клиента. Они имеют одинаковые разрешения, но если пользователь A будет загружать свои документы, мне нужно прикрепить новое разрешение для пользователя A, но не для пользователя B.
Мое решение состоит в том, чтобы создать новую таблицу, к которой я прикрепляю разрешения для пользователей.
User_permissions:
Id | user_id | permission_id
____________________________
1 | 1 | 4
Таким образом, все разрешения пользователя будут разрешениями его роли + разрешениями из таблицы, описанной выше.
Ребята, вы должны помочь мне решить, является ли это решение хорошим или плохим, или есть другой способ лучше этого? (что является лучшей практикой для такого рода проблем?)
3 ответа
Вы можете рассмотреть возможность использования накопительной многоцелевой схемы
разрешить каждому пользователю иметь упорядоченный список ролей.
создавать пользовательские роли для каждого пользователя, нуждающегося в специальном наборе разрешений.
разрешить ролям предоставлять и отзывать разрешения.
Предположим, что Энн и Беатрис оба являются администраторами, но Беатрис не может удалять заказы. Предположим, Кэтрин не администратор, но имеет право добавлять администраторов.
Когда вы можете настроить эти роли:
Admin: grant approve_order grant delete_order grant add_admin grant delete_admin
Beatrice: withdraw delete_order
Catherine: grant add_admin
Тогда у Анны роль Админа. Беатрис имеет роль администратора и свою личную роль Беатрис. Кэтрин играет свою личную роль.
Опыт научил меня, что такая система очень гибкая, но все же достаточно простая, чтобы легко обрабатывать стандартные пользовательские конфигурации для многих пользователей. НО, трудно провести аудит - сложно понять, кто из ваших настроенных пользователей имеет какие привилегии. Если вы используете систему в течение нескольких лет, это может быть очень запутанным.
Вы можете рассмотреть шаблон схемы. Создайте шаблон пользователей для каждой роли со списком необходимых разрешений.
Затем при добавлении новых пользователей выберите правильный шаблон роли и назначьте пользователю те же разрешения, что и для шаблона. Если им нужны дополнительные разрешения, предоставьте их.
Это просто Но обновление шаблона не обновляет разрешения для ранее существующих пользователей, сделанные из этого шаблона.
Хороший вопрос... вы можете создать новую роль для другого клиента с другими разрешениями без создания новой таблицы User_permissions