Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Optimierung von Permission-Mechanismen


BrunoH - Mo 10.09.18 16:19
Titel: Optimierung von Permission-Mechanismen
Hallo zusammen,

ich hätte eine recht allgemeine Frage: wie kann man ein Rechtesystem möglichst performant gestalten?

Folgendes habe ich vor:


Gedanken dazu:
Bei einem einfachen SELECT auf eine Table kann man ja nicht viel rausholen. Wenn man eine Struktur mit den Tabellen "USER", "GROUP", "PERMISSION" und "MEMBERSHIP" (Zuordnungstabelle mit UserId, GroupId) aufbaut, wird's zwar schon komplexer aber auch da kann man wenig optimieren. Aber wie sieht die Sache aus, wenn Gruppen auch Mitglied anderer Gruppen sein können und ihre Rechte weitervererben? Die SQL-Statements können da ja recht schnell ziemlich komplex werden und sind damit in der Regel auch langsam. Gibt es da "Best Practices" um sowas umzusetzen? Macht es Sinn, dass man allein aus Performance-Gründen eine extra Effective-Permission-Table führt, die die tatsächlichen Berechtigungen widerspiegelt und bei jeder Rechte-Änderung aktualisiert wird? (Bisher ist das mein bester Gedanke um eine möglich gute Performance zu bekommen)

Ich habe aktuell keinen tatsächlichen Fall und baue mir gerade nur ein Projekt im Kopf zusammen... aber generell finde ich solche Design-Überlegungen recht interessant. Einen "optimalen Weg" wird's wahrscheinlich auch hier nicht geben, aber vielleicht gibt es ja interessante Herangehensweisen?

Viele Grüße,
Bruno


Narses - Mo 10.09.18 17:34

Moin und :welcome: im Forum!

user profile iconBrunoH hat folgendes geschrieben Zum zitierten Posting springen:
wie kann man ein Rechtesystem möglichst performant gestalten?
Du hast das Wesentliche schon zusammengefasst: entweder "vorausberechnen" (Gruppen-in-Gruppen "flach" rechnen, um die Rekusion zu vermeiden) oder "cachen", viel Anderes gibt´s da nicht. :nixweiss:

IBM verfolgt bei Notes sehr konsequent das Caching (da Notes eh schon langsam ist, auch dringend nötig), Microsoft geht den Weg noch etwas weiter und vergibt bei der (Windows-)Anmeldung Access-Tokens, an denen die konkreten Rechte hängen (deshalb kriegt man neue AD-Gruppen auch immer erst mit der nächsten Windows-Anmeldung mit). :idea:

Andererseits: mit welchen Workloads rechnest du denn? >10k Access-Request pro Sekunde? :lupe: Wenn es weniger ist, dann würde ich einfach empfehlen, mal deinem RDBMS zu "vertrauen" und es auszuprobieren. Die Zeiten von MySQL 1.0 sind ja nun auch schon ein paar Tage vorbei... :zwinker:

cu
Narses


BrunoH - Mi 12.09.18 16:28

Na dann mal ein freundliches Servus zurück :D

Ok, sowas in der Art dachte ich mir schon, aber manchmal gibt es ja doch auch überraschende Herangehensweisen von Querdenkern, die plötzlich viel schneller und besser funktionieren und man selbst kommt nie auf sowas ;) Gelegentlich bin ich auch schon über Single-Table-Lösungen gestolpert wo User, Gruppen und Rechte in einer einzigen Table zusammengequetscht wurden und vermutlich über Self-Join ausgewertet wurden. Mir war das nur immer zu suspekt um es auch so zu machen (widerspricht ja jeder Norm) :D

Ehrlichgesagt hab ich noch keinerlei Zahlen, aber nachdem es eine LAN-Application werden soll rechne ich mit weit unter 10k calls/sec, möchte dafür aber mit etwas komplexeren Gruppenstrukturen arbeiten... naja und wenn ich schon was anfange, dann soll's ja auch performant arbeiten :D

Vielen Dank jedenfalls für's Feedback... ich denke das "flach rechnen" wird vermutlich der Way-To-Go werden auch wenn es mehr Aufwand im Vergleich zum Caching ist, aber für mein Vorhaben überwiegen da die Vorteile


Blup - Mi 12.09.18 16:44

Zu dem Thema passt das wohl ganz gut: https://de.wikipedia.org/wiki/Sicht_(Datenbank)#Materialized_View


Ralf Jansen - Mi 12.09.18 16:51

Zitat:
Ok, sowas in der Art dachte ich mir schon, aber manchmal gibt es ja doch auch überraschende Herangehensweisen von Querdenkern, die plötzlich viel schneller und besser funktionieren und man selbst kommt nie auf sowas ;) Gelegentlich bin ich auch schon über Single-Table-Lösungen gestolpert wo User, Gruppen und Rechte in einer einzigen Table zusammengequetscht wurden und vermutlich über Self-Join ausgewertet wurden. Mir war das nur immer zu suspekt um es auch so zu machen (widerspricht ja jeder Norm) :D


Quergedacht würde ich mich fragen warum du Rechte überhaupt in eine relationale Datenbank packen willst. Warum nicht irgendeinen Verzeichnisdienst (unter Windows z.B Active Directory) der genau für sowas gedacht ist? Deine Punkteliste deutet nichts an was eine Rechte oder Userverwaltung nahe an den Daten erfordert. Also z.B. irgendwelche Rechte auf direkter Datensatzebene.


BrunoH - Fr 14.09.18 07:32

user profile iconBlup hat folgendes geschrieben Zum zitierten Posting springen:
Zu dem Thema passt das wohl ganz gut: https://de.wikipedia.org/wiki/Sicht_(Datenbank)#Materialized_View

Ja genau, sowas in der Richtung... gut zu wissen, dass es dafür auch einen Namen gibt :)

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Quergedacht würde ich mich fragen warum du Rechte überhaupt in eine relationale Datenbank packen willst. Warum nicht irgendeinen Verzeichnisdienst (unter Windows z.B Active Directory) der genau für sowas gedacht ist? Deine Punkteliste deutet nichts an was eine Rechte oder Userverwaltung nahe an den Daten erfordert. Also z.B. irgendwelche Rechte auf direkter Datensatzebene.

Ok, ich hab das wirklich sehr allgemein formuliert. Kann man Directory Services in einer eigenen Applikation nutzen für die Rechtevergabe? Also z.B. "Benutzer X darf den Register 'Einstellungen' sehen" oder "Benutzer X darf keine Daten exportieren"?


Narses - Fr 14.09.18 09:35

Moin!

user profile iconBrunoH hat folgendes geschrieben Zum zitierten Posting springen:
Kann man Directory Services in einer eigenen Applikation nutzen für die Rechtevergabe? Also z.B. "Benutzer X darf den Register 'Einstellungen' sehen" oder "Benutzer X darf keine Daten exportieren"?
Man kann Gruppenzugehörigkeiten prüfen, was du dann damit dem Ergebnis machst, ist doch deine Sache... ;) (und hier käme dann trotzdem wieder der Cache in´s Spiel, sonst dürfte das exponentiell steigende Requests auf dem AD/LDAP bedeuten :hair:)

cu
Narses