2016-06-08 5 views
3

Я пытаюсь реализовать 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'? И затем, когда вы просматриваете роль, я сначала формирую контекстную строку?

ответ

0

таблица Пользователя может иметь перекрестную ссылку на рольганг, каждый рулон имеет конкретный идентификационный номер роли с can_write, can_read колонки (ЭСТ ...)

Вашего heircachy может выглядеть примерно так:

Users: 
    uid(int) auto_increment primary 
    role_id(int) 

Roles: 
    rid(int) auto_increment primary 
    description(varchar) 
    // any access values ie: can_read(int) 

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

Некоторые примеры кода для вступающей этих таблиц:

$stmp = (new PDO(...))->Prepare("SELECT role_id FROM Users WHERE uid = :userid"); 
$stmp->bindValue(":userid", $id); // I'd suggest storing a login key using sessions 
$stmp->execute(); 
$user_permissions = $stmp->Fetch()['role_id']; 

// Reference the Roles table for permission lists 
$stmp = (new PDO(...))->Prepare("SELECT * FROM Roles WHERE rid = :roleid"); 
$stmp->bindValue(":roleid", $user_permissions); 
[...] 

Надежда это помогло.

+0

Спасибо, Кайл, что похоже на то, что я придумал до сих пор - с одной стороны, с которой я сейчас борюсь, - как иметь иерархию ролей в этих контекстах. Я обновляю свой вопрос с дополнительной информацией. –

+0

Эй, Кайл, я добавил дополнительную информацию к вопросам, любые рекомендации/советы были бы очень оценены - я собираюсь кругами на этом! –

+0

Извините @MattBryson Я не слишком хорош с SQL - я проголосую за вопрос, чтобы кто-то мог вам помочь. Однако подумайте, что вы слишком сильно зависите от настройки, вы можете достичь большей части этого с помощью простого PHP-кода. – KDOT

Смежные вопросы