2016-06-08 3 views
3

RBAC를 구현하려고하는데 사용자가 개의 복수 역할을 가질 수 있으며 각각은 특정 컨텍스트 아래에 있습니다.컨텍스트가있는 역할 기반 액세스 제어 (RBAC)?

이 컨텍스트는 3 가지 요인, Company, ProductRegion을 기반으로합니다.

는 지역 RBAC 이런 종류의 가장 좋은 방법이 설정되어 무엇 4

> 그래서 사용자 A가 회사 1의 Admin 될 수 있으며, 또한 회사 2> 제품 3의 Viewer 수?

필자는이 순간을 손으로 돌리고 있습니다. 따라서이 수준의 세분화 된 액세스를 허용 할 수있는 DB 테이블을 구성하는 가장 좋은 방법을 모색하고 있습니다.

불행히도 이것은 PHP CodeIgniter/mySQL을 실행하는 레거시 응용 프로그램에 있습니다. 따라서 모든 기존의 기존 lib는 호환되지 않을 수 있습니다.

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

카일 (Kyle)은 제가 지금까지 생각해 낸 것과 비슷합니다. 제가 지금 고민하고있는 한가지는 이러한 맥락에서 역할 계층 구조를 갖는 방법입니다. 약간의 추가 정보로 내 질문을 업데이트하십시오. –

+0

카일 헤이, 질문에 대한 더 많은 정보를 추가했는데, 어떤 조언이나 조언도 많이 부탁드립니다. –

+0

죄송합니다 @MattBryson 저는 SQL에 너무 좋지 않습니다 - 나는 누군가에게 당신에게 더 나은 도움을 줄 수 있도록 질문에 투표 할 것입니다. 그러나 설정에 너무 의존한다고 생각하면 간단한 PHP 코드로 대부분의 것을 얻을 수 있습니다. – KDOT

관련 문제