Как назначить роли и разрешения для пользователя, когда контроль доступа на основе ролей не достаточно? - PullRequest
0 голосов
/ 16 декабря 2018

В приложении 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 ]

0 голосов
/ 16 декабря 2018

Вы можете рассмотреть возможность использования совокупной много ролевой схемы

  1. , позволяющей каждому пользователю иметь упорядоченный список ролей.

  2. создавать пользовательскиеРоли для каждого пользователя, нуждающегося в специальном наборе разрешений.

  3. позволяют ролям предоставлять и отзывать разрешения.

Предположим, что Энн и Беатрис обаАдминистраторы, но Беатрис не может удалять заказы.Предположим, Кэтрин не администратор, но имеет право добавлять администраторов.

Когда вы можете настроить эти роли:

    Admin:  grant approve_order  grant delete_order  grant add_admin  grant delete_admin     
 Beatrice:  withdraw delete_order
Catherine:  grant add_admin

Тогда у Анны будет роль администратора.Беатрис имеет роль администратора и свою личную роль Беатрис.Кэтрин играет свою личную роль.

Опыт научил меня, что такая система очень гибкая, но все же достаточно простая, чтобы легко обрабатывать стандартные пользовательские конфигурации для многих пользователей.НО, трудно провести аудит - сложно понять, кто из ваших настроенных пользователей имеет какие привилегии.Если вы используете систему в течение нескольких лет, это может быть очень запутанным.

0 голосов
/ 16 декабря 2018

Можно рассмотреть шаблон схемы.Создайте пользователей шаблона для каждой роли со списком необходимых разрешений.

Затем при добавлении новых пользователей выберите правильный шаблон роли и назначьте пользователю те же разрешения, что и у шаблона.Если им нужны дополнительные разрешения, предоставьте их.

Это просто.Но обновление шаблона не обновляет разрешения для ранее существующих пользователей, сделанные из этого шаблона.

0 голосов
/ 16 декабря 2018

хороший вопрос ... вы можете создать новую роль для другого клиента с другими разрешениями без создания новой таблицы User_permissions

...