Ich vermute mal, dass du irgendein DBMS im Hintergrund hast, mit dem du arbeitest.
Üblich bei solchen Konstellationen sind dann Kreuztabellen (heißen die so?).
Du hast ja wahrscheinlich dann ohnehin zwei Tabellen, Benutzer und Listen.
User:
uid | name | gruppe
0 | root | administratoren
1 | user1 |
2 | user 2 | priviligierte_benutzer
3 | us3r | foobar
Wenn dem so ist ist das schonmal schlecht ^^ Trenne die Gruppen von den Benutzern:
Groups:
gid | name
0 | Administratoren
1 | priviligierte Benutzer
2 | foobar
und erstelle eine Kreuztabelle:
ugid | uid | gid
0 | 0 | 0
1 | 2 | 1
2 | 3 | 2
User0 ist also Gruppe0 zugeordnet, User2 der Gruppe1 und User3 der Gruppe2. Das ermöglicht es auch in mehreren Gruppen zu sein..
ugid | uid | gid
3 | 2 | 2
schon ist Benutzer2 in Gruppe1 und in Gruppe2 :)
Und mit deinen 2do-Listen machst du das gleiche:
Lists:
lid | name | subof | besitzer
0 | liste1 | null | 0
1 | liste2 | null | 1
2 | liste2.2 | 1 | 1
3 | liste3 | null | 2
Liste1 gehört nun root und ist seine "Überliste". Liste2 gehört user1 und ist seine Überliste, sie enthält Liste2.2, die auch user1 gehört.
Und dann kreuzt du auch das:
ListRights
lrid | uid | gid | lid | rechte
0 | 0 | null | 0 | 5
1 | 1 | null | 1 | 5
2 | 1 | null | 2 | 5
3 | 2 | null | 3 | 5
Ich habe "6" jetzt mal als höchsten Wert für maximale Rechte mir ausgedacht:
0 - keine Rechte
1 - Lesen
2 - schreiben
3 - überschreiben / löschen
4 - ausführen
5 - überschreiben, löschen und ausführen
Unter bestimmten Voraussetzungen kann man auch wollen, dass Benutzer nur schreiben und nicht lesen können sollen. Keine Ahnung, was dein Projekt da vor sieht.
Jedenfalls würde die Tabelle oben jetzt jedem Benutzer maximal alle Rechte an seinen eigenen Listen gewähren. Jetzt legt root eine neue Liste an und will priviligierte_benutzer sowie us3r erlauben darauf lesend und schreibend zuzugreifen:
Lists:
lid | name | subof | besitzer
4 | liste1.3 | 0 | 0
ListRights
lrid | uid | gid | lid | rechte
4 | null| 1 | 4 | 2
5 | 3 | null | 4 | 2
Du kannst Gruppen- und Benutzer-Berechtigungen auch in getrennten Tabellen speichern oder in der gleichen Spalte und natürlich kannst du auch ein feineres oder gröberes Rechtesystem erstellen.
Um jetzt noch allgemeine Regeln wie "für alle" oder so zu bauen verfrachtest du einfach _alle_ Benutzer in eine Gruppe namens "Benutzer" oder "Gäste" oder was weiß ich und trägst z.B. ein...
Groups:
gid | name
3 | alle
User/Group-Kreuztabelle
ugid | uid | gid
3 | 0 | 3
4 | 1 | 3
5 | 2 | 3
6 | 3 | 3
ListRights
lrid | uid | gid | lid | rechte
5 | null| 3 | 4 | 1
Nun sind alle User in Gruppe "alle" und die Gruppe "alle" hat lesenden Zugriff auf Liste4 (namens Liste1.1).
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(