Hallo zusammen,
ich habe mir noch ein paar Gedanken über mein Berechtigungssystem gemacht. Vielleicht kann ja noch jemand etwas dazu sagen.
Meine Vorstellung ging in die Richtung, dass ich mir eine Klasse erzeuge die die Ordnerobjekte abbilden soll. Grob gesagt etwa so:
Delphi-Quellcode:
TDirectory = class(TInterfacedObject, I...)
public
property Name: string read FName write FName;
property InheritedPermissions: Boolean read FInheritedPermissions; // Zum Aufheben/Aktivieren der Vererbung muss explizit eine Funktion aufgerufen werden (würde theoretisch auch über den Setter funktionieren)
property Directories: TObjectList<TDirectory> read FDirectories write FDirectories;
// property Groups: TObjectList<TGroup> read FGroups write FGroups; // Beinhaltet alle Gruppen, die diesem DirectoryObject zugeordnet sind. Kann man das noch optimieren? Hier wird wenn ich es richtig weiß ja nur ein Pointer auf meine Gruppen in die Liste übernommen, welche bereits in einer Hauptliste aller Gruppen gespeichert sind.
// property Users: TObjectList<TUser> read FUsers write FUsers; // Beinhaltet alle Gruppen, die diesem DirectoryObject zugeordnet sind. Kann man das noch optimieren? Hier wird wenn ich es richtig weiß ja nur ein Pointer auf meine Benutzer in die Liste übernommen, welche bereits in einer Hauptliste aller Benutzer gespeichert sind.
end;
Das Dumme ist jetzt, dass jede Gruppe und jeder Benutzer in jedem Verzeichnis andere Berechtigungen haben kann. Das heißt, dass das Benutzer- / Gruppenobjekt wiederum mit dem Berechtigungen eines Verzeichnisses gekoppelt werden müsste ohne, dass das Benutzerobjekt für jedes Verzeichnis extra instanziiert werden muss.
Die Berechtigungen für Benutzer und Gruppen müsste dann in einer Klasse abgelegt werden. Hier würde sich eine gemeinsame Basisklasse anbieten in der folgende zwei Properties für die Berechtigungen enthalten sind:
Delphi-Quellcode:
property Allowed: Integer read FAllowed write SetAllowed;
property Denied: Integer read FDenied write SetDenied;
Die Berechtigungen die ein Benutzer / eine Gruppe effektiv später hat, sollte dann so ausgerechnet werden können: (Ich bilde die Berechtigungen binär ab)
Eigentlich wollte ich die CODE-Tags dafür nehmen, aber da scheint es immer noch einen Bug zu geben. Mir wird zumindest nichts angezeigt.
Delphi-Quellcode:
Berechtigungen von Gruppen in Verzeichnis A:
Zuerst werden alle Gruppenberechtigungen Allowed und Denied mit OR miteinander verknüpft
Allowed --- Denied
Gruppe 1: 0 1 1 0 0 --- 1 0 1 1 0
Gruppe 2: 0 1 0 0 1 --- 0 0 1 0 0
Gruppe 3: 0 0 0 0 1 --- 0 0 0 0 0
------------------------
0 1 1 0 1 --- 1 0 1 1 0
Die Ergebnisse werden dann mit XOR verknüpft
Allowed: 0 1 1 0 1
Denied: 1 0 1 1 0
---------
XOR: 1 1 0 1 1
Zum Schluss muss das Ergenis wieder mit den eigentlichen Allowed Permissions mit AND verknüpft werden damit nicht plötzlich Denied Rechte als Allowed Rechte gewertet werden.
XOR: 1 1 0 1 1
Allowed: 0 1 1 0 1
---------
0 1 0 0 1
Das gleiche Verfahren sollte mit Benutzern ebenfalls funktionieren. Zum Schluss müssen beide Ergebniswerte wieder mit OR miteinander verknüpft werden, um die schlussendlich kombinierten Gruppen und Userrechte zu erhalten.
Jetzt die Frage an die Nerds
: Gibt es hierfür noch eine schnellere Variante oder ist das die schnellste Lösung?
Und dann generell: Gibt es hierfür noch irgendwelche Vorschläge oder Ideen? Oder etwas was ich beachten sollte wenn ich es so mache? Das ist jetzt im Moment nur eine Idee bei der ich nicht weiß, ob ich mit dieser alles abbilden kann was ich vorhabe.