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?
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. –
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! –
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