Я пытаюсь реализовать RBAC, но пользователь может иметь несколько ролей, каждый под конкретным контекстом.Управление доступом на основе ролей (RBAC) с контекстом?
Контекст основан на 3 факторах, Company
, Product
и Region
.
Так пользователь А может быть Admin
Компании 1, а также быть Viewer
Компании 2> Продукт 3> Регион 4
Что является лучшим подходом для такого рода RBAC установить?
Я сейчас ругаю это, так что ищу лучший способ структурирования таблиц БД, которые позволили бы обеспечить этот уровень гранулированного доступа.
К сожалению, это устаревшее приложение с запусками PHP CodeIgniter/mySQL - поэтому любые современные существующие библиотеки, вероятно, несовместимы.
UPDATE
меня это до сих пор. Permissions
таблицы привязаны к Roles
, Roles
затем назначаются пользователям и заданному контексту.
account_id | role_id | company_id | product_id | region_id |
------------------------------------------------------------
1 | 1 | | | |
2 | 2 | 1 | | |
2 | 3 | 2 | 1 | |
3 | 4 | 3 | 1 | 2 |
3 | 4 | 3 | 1 | 3 |
3 | 4 | 3 | 1 | 4 |
SQL, для этого выглядит немного как это ...
SELECT DISTINCT account_id
FROM user_roles ur, role_permissions rp
JOIN permissions p ON rp.permission_id=p.id
WHERE (
#correct user that has a role with the permission we want
ur.account_id = 1
AND rp.permission_id IN (1,2,3)
AND ur.role_id = rp.role_id
#if the user is sys admin they can see everything
AND (
ur.role_id = 1
#if the user is company admin
OR ( ur.role_id = 2 AND [email protected])
#if the user is product admin
OR (ur.role_id = 3 AND [email protected] AND [email protected])
#if the user is any other role then the need explicit access
OR (ur.role_id > 3 AND [email protected] AND [email protected] AND [email protected])
)
);
Это работает, но я уверен, что там должен быть лучший способ сделать это.
Следующая проблема: как применить иерархию к ролям?
Итак, «Администратор» компании> продукт> регион может создавать только пользователей, их роли или ниже?
Мне нужно будет найти роль, которую они назначили в контексте, в котором мы находимся, и затем вернуть каждую роль, у которой более низкий ранг, чем у пользователей.
Может ли этот контекст лучше размещаться в виде строки? '1.3.gb'/'1.2'? И затем, когда вы просматриваете роль, я сначала формирую контекстную строку?
Спасибо, Кайл, что похоже на то, что я придумал до сих пор - с одной стороны, с которой я сейчас борюсь, - как иметь иерархию ролей в этих контекстах. Я обновляю свой вопрос с дополнительной информацией. –
Эй, Кайл, я добавил дополнительную информацию к вопросам, любые рекомендации/советы были бы очень оценены - я собираюсь кругами на этом! –
Извините @MattBryson Я не слишком хорош с SQL - я проголосую за вопрос, чтобы кто-то мог вам помочь. Однако подумайте, что вы слишком сильно зависите от настройки, вы можете достичь большей части этого с помощью простого PHP-кода. – KDOT