Wie erzielen große Websites Berechtigungen auf Zeilenebene?

8

Also mache ich eine kleine Seite mit CakePHP, und meine ACL ist so eingerichtet, dass jedes Mal, wenn ein Inhalt erstellt wird, eine ACL-Regel erstellt wird, um den Eigentümer des Inhalts mit dem tatsächlichen Inhalt zu verknüpfen. Dadurch kann jeder Besitzer seinen eigenen Inhalt bearbeiten / löschen. Diese Methode scheint nur so ineffizient zu sein, weil es eine äquivalente Menge an ACL-Regeln als Inhalt in der Datenbank gibt. Ich war neugierig, wie lösen große Websites mit Millionen von Inhalten dieses Problem?

    
JayD3e 10.01.2011, 21:52
quelle

3 Antworten

10

Bei großen Seiten, an denen ich gearbeitet habe, wurden Zugriffsberechtigungen auf Anwendungsebene festgelegt. Die Datenbank verknüpfte den Inhalt mit dem Datensatz eines Benutzers, und dann in der Datenzugriffs- / Geschäftslogikebene wurde festgestellt, ob der Benutzer über ausreichende Rechte zum Zugriff auf den Inhalt verfügt oder nicht.

Für eine große Website mit dynamischen Inhalten wäre das wahrscheinlich der beste Weg, damit umzugehen.

EDIT: Um ein konkreteres Beispiel hinzuzufügen.

Beispiel: Ok, sagen wir, wir haben eine einfache Dateispeicherstelle, wo ein Benutzer nur auf seine Daten oder Daten zugreifen kann, die von einem anderen Benutzer explizit mit ihnen geteilt wurden.

Da diese Anwendung ziemlich einfach ist, da sie nur Dateien bereitstellt, hat sie nur drei Datenbanktabellen:

%Vor%

Nun sind einige grundlegende Regeln, die wir in unserer Datenzugriffsebene definieren möchten, dass Benutzer, wenn sie angemeldet sind, auf Dateien zugreifen können, deren Eigentümer sie sind, und auf Dateien, die andere Benutzer mit ihnen geteilt haben. Entweder über gespeicherte Prozeduren oder durch Erstellen der Abfrage, die an den Datenbankserver gesendet werden soll, würde ich sicherstellen, dass meine Abfragen nur die Datensätze zurückgeben, auf die sie zugreifen können.

Hier die grundlegende GetUsersFileList-Abfrage für die Anmeldung eines Benutzers:

%Vor%

Wie Sie hier sehen können, verwenden wir eine parametrisierte Abfrage, um die Dateien zu erhalten, deren Besitzer der Benutzer ist. Zusätzlich würden wir nach den freigegebenen Dateien fragen, um sie dem Benutzer anzuzeigen.

Wenn wir nun davon ausgehen, dass jede Datei ihre eigene eindeutige URL hat, wie zum Beispiel:

%Vor%

Wenn wir dann versuchen, die Datei zu erhalten, verwenden wir eine ähnliche Abfrage wie oben, um die Dateidaten zu erhalten:

%Vor%

So sehen Sie, wenn wir versuchen, die Datei zu erhalten, verwenden wir immer noch die UserId in der Abfrage, also wenn der Benutzer die Datei nicht gemeinsam mit ihnen hat oder sie nicht der Eigentümer der Datei sind, wird das Ergebnis der Abfrage sei 0 Zeilen.

Die Berechtigungen werden also von dem bestimmt, dem ein Benutzer in der Datenbank zugeordnet ist, aber die tatsächliche Durchsetzung erfolgt durch sorgfältiges Schreiben Ihres Datenzugriffscodes und / oder zusätzlicher Prüfungen in Ihrer Geschäftslogikschicht, bevor der Inhalt bereitgestellt wird.

EDIT2: Ich bin am vertrautesten mit MSSQL, so dass meine Abfragen oben in T-SQL sind, so dass die Syntax für MySql ein wenig ausfällt.

EDIT3: Ersetzte die Business-Logik-Ebene durch die Datenzugriffsschicht, da in diesem Beispiel die einzigen durchgeführten Prüfungen innerhalb der Datenzugriffsabfragen selbst liegen.

EDIT4: Ok, bezogen auf die Business-Logik-Ebene, da komplexere Anwendungen komplexere Berechtigungsschemata benötigen, die zusätzliche Prüfungen in der Business-Logik-Ebene erfordern.

    
Adrian 10.01.2011, 22:00
quelle
2

Anstatt für jedes Inhaltselement eine separate ACL zu haben, können Sie für jede unterschiedliche Gruppe von Berechtigungen eine separate ACL einrichten. Die meisten Inhaltselemente für einen bestimmten Benutzer haben die gleichen Berechtigungen, sodass sie alle auf dieselbe ACL verweisen können. Dies könnte auch ermöglichen, Berechtigungsprüfungen zwischenzuspeichern (z. B. "Benutzer 123 hat die Erlaubnis, ACL 456 zu lesen"). Am Ende werden Sie sehr wenige ACLs haben - nur alle Standard-ACLs und die wenigen Ausnahmen.

    
Gabe 10.01.2011 22:04
quelle
0

Die gleiche Regel gilt für große und kleine Sites. Wenn Sie eine spezifischere Kontrolle wünschen, müssen Sie mehr Daten in der Datenbank speichern. Das Problem, das Sie zu lösen versuchen [Benutzern erlauben, nur ihren Inhalt zu verwalten], kann mit einer einfachen Benutzer-ID-Verknüpfung zwischen Tabellen gelöst werden [z. B. users.id & lt; - & gt; articles.userId], muss nicht jede Zeile mit dem Benutzer verknüpft werden. Ich würde vorschlagen, allgemeinere Regeln zu verwenden und nur Ausnahmen zu speichern [um beispielsweise bestimmten Benutzern zu erlauben, andere Benutzerinhalte zu bearbeiten] als externe Daten.

    
Tomasz Kowalczyk 10.01.2011 22:02
quelle

Tags und Links