2016-06-08 6 views
3

Ich versuche, RBAC zu implementieren, aber ein Benutzer kann mehrere Rollen haben, jeweils unter einem bestimmten Kontext. Der Kontext basiert auf 3 Faktoren, Company, Product und Region.Rollenbasierte Zugriffskontrollen (RBAC) mit Kontext?

So Benutzer A könnte ein Admin der Firma 1, und auch ein Viewer von Company 2 sein sein> Produkt 3> Region 4

Was für diese Art von RBAC gründet der beste Ansatz ist?

Ich bin Hand rolling dies im Moment - also auf der Suche nach dem besten Weg zur Struktur der DB-Tabellen, die für diese Stufe der granularen Zugriff ermöglichen würde.

Leider ist dies auf einer Legacy-Anwendung mit PHP CodeIgniter/mySQL - so dass alle modernen vorhandenen Bibliotheken sind wahrscheinlich nicht kompatibel.

UPDATE

Ich habe dies so weit. Permissions Tabellenkarten zu Roles, Roles werden dann Benutzern zugewiesen und Kontext gegeben.

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  | 

Die SQL für diese sieht ein bisschen wie diese ...

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]) 
    ) 

); 

Dies funktioniert, aber ich bin sicher, dass es ein besserer Weg, dies zu tun.

Die nächste Frage ist, wie Sie dann eine Hierarchie auf die Rollen anwenden?
So ein 'Admin' einer Firma> Produkt> Region kann nur Benutzer, ihrer Rolle oder niedriger erstellen?

Ich müsste die Rolle, die sie zugewiesen haben, in dem Kontext, in dem wir uns befinden, nachschlagen und dann jede Rolle zurückgeben, die einen niedrigeren Rang als die Benutzer hat?

Könnte dieser Kontext besser als String platziert werden? "1.3.gb"/"1.2"? Und wenn ich dann die Rolle nachschaue, formiere ich zuerst den Kontextstring?

Antwort

0

Benutzertabelle einen Querverweis auf eine Rolltisch haben kann, hat jede Rolle eine spezifische Rolle Identifikationsnummer mit einer can_write, can_read Säule (ect ...)

Ihre heircachy könnte wie folgt aussehen:

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

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

Dann könnten Sie eine Unterrolltabelle einrichten, die das Anzeigen von Regionen ermöglicht.

Einige Beispiel-Code für den Zugriff dieser Tabellen:

$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); 
[...] 

Hope this geholfen.

+0

Dank Kyle, das ist ähnlich dem, was ich bisher gefunden habe - die eine Sache, mit der ich im Moment zu kämpfen habe, ist, wie man eine Rollenhierarchie innerhalb dieser Kontexte hat. Ich werde meine Frage mit einigen weiteren Informationen aktualisieren. –

+0

Hey Kyle, ich habe ein paar mehr Informationen zu den Fragen hinzugefügt, alle Hinweise/Ratschläge wären sehr willkommen - ich gehe hier im Kreis herum! –

+0

Sorry @MattBryson Ich bin nicht gut mit SQL - Ich werde die Frage abstimmen, damit jemand Ihnen etwas bessere Hilfe geben kann. Denken Sie jedoch, dass Sie sich zu sehr auf ein Setup verlassen, Sie können das meiste mit einfachem PHP-Code erreichen. – KDOT

Verwandte Themen