2013-04-11 12 views
7

Ich habe versucht, eine Lösung für dieses Problem für ein paar Tage jetzt zu finden, und ich kann einfach nicht kommen, mit etwas zu finden, das funktioniert. Das Problem ist das folgende:MySQL Datenbank Schema für Benutzer und Gruppen Zugriffskontrolle

Ich entwickle gerade ein Statistikwerkzeug, das einige Diagramme und Daten für mehrere Anwendungen zeigt. Der Zugriff auf diese Daten muss natürlich eingeschränkt werden, da Benutzer A die Anwendungen "Eins" und "Zwei" besitzt und nicht "Drei" oder "Vier" sehen darf.

Jetzt kann jeder Benutzer Mitglied mehrerer Gruppen sein und Berechtigungen von dieser Gruppe erben, aber auch individuelle Berechtigungen haben. Diese Berechtigungen müssen für jede Anwendung festgelegt werden. Der Zugriff auf eine Reihe von Daten von einer Anwendung wird nicht gewährt, wenn:

  • Der Benutzer selbst die Erlaubnis, diesen Teil der Daten dieser Anwendung zuzugreifen
  • Jede der Gruppen der Benutzer Mitglied ist berechtigt, dieses Stück Daten dieser Anwendung zuzugreifen

http://i.stack.imgur.com/y4W6E.png

Das Ziel, einen Tisch zu haben, ist, dass die tatsächlichen Berechtigungen jeder Benutzer derzeit für jede Anwendung hat speichert, von den Gruppenmitgliedschaften und i berechnet individuelle Berechtigungen und haben diese Informationen aufgrund der Beziehungen zu anderen Tabellen jederzeit konsistent.

Ich weiß nicht, ob dies eine Lösung zu finden hilft, aber hier ist die SQL-1 die aktuell aktiven Berechtigungen des Benutzers mit der ID zu erhalten:

(
SELECT u.perm_id AS perm, u.user_id AS uid, u.app_id AS app 
FROM daUsers_has_daPermissions AS u 
WHERE u.user_id = 1 
) 
UNION 
(
SELECT g.perm_id AS perm, u.user_id AS uid, g.app_id AS app 
FROM daUsers_has_daPermissions AS u, daUsergroup_has_daPermissions AS g, daUsergroup_has_daUsers AS g_has_u 
WHERE u.user_id = 1 
AND u.user_id = g_has_u.user_id 
AND g.group_id = g_has_u.group_id 
); 

Dies ist, was ich in einem speichern möchten extra Tabelle (nur für alle Benutzer).

Antwort

3

Klingt für mich sollten Sie eine Ansicht verwenden. Sie haben bereits die Abfrage, verwenden Sie die Abfrage, um eine Sicht zu erstellen.

+0

Danke für den Hinweis, ich wusste nicht einmal, was eine Ansicht war bis jetzt. Ich werde das vorläufig tun, aber es löst mein Problem nicht wirklich, da die Ansicht auch alle Daten von jeder relevanten Tabelle jedes Mal sammelt, wenn jemand Daten von ihr anfordert, was genau das ist, was ich vermeiden möchte . Ich möchte diese Informationen in einer Tabelle speichern und ** nur ** aktualisieren, wenn tatsächlich Änderungen an etwas vorgenommen werden, das sich auf Berechtigungen auswirkt (z. B. wenn eine Gruppe gelöscht wird). – Anpan

+0

Dann könnten Sie Trigger verwenden. [MYSQLtriggers] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html). Wenn eine Tabelle aktualisiert wird, die sich auf Berechtigungen auswirkt. Veranlasst den Trigger, die Tabelle zu aktualisieren, in der alle Berechtigungen gespeichert sind. –

+0

Sie benötigen eine materialisierte Ansicht, eine Funktion, die es in MySQL nicht gibt. Aber ja, Sie können [eine simulieren] (http://www.fromdual.com/mysql-materialized-views), indem Sie eine neue Tabelle definieren und mithilfe von Triggern sicherstellen, dass sie korrekt ausgefüllt ist. –

Verwandte Themen