Um herauszufinden, welche Menüpunkte ein Benutzer sehen darf, brauche ich eine Datenbankabfrage.
Tabelle pages
page: id der Seite
foo: ein Abfragekriterium
status: gibt an, ob die Seite öffentlich (status 0 oder 1) oder nur mit Berechtigung sichtbar ist (status 2). Ein Status von -1 bedeutet, dass die Seite nie zu sehen ist.
Tabelle authorisations
admin: gibt die id des Benutzers an
page: die Seitenid für die diese Berechtigung gilt
type: gibt an, ob der Benutzer die Seite sehen (type=1) oder bearbeiten darf (type=2)
Bsp:
admin | page | type
1 | 12 | 1
1 | 13 | 2
2 | 12 | 1
(Wie macht man hier Tabellen?)
Dies gibt an, dass Benutzer 1 Seite 12 und 13 ansehen darf, Benutzer 2 aber nur Seite 12.
Ein Eintrag mit type=0 steht genauso wie ein fehlender Eintrag für kein Recht zum Ansehen.
So nun zum eigentlichen Problem:
Ich möchte nun alle Seiten finden, die ein bestimmtes Abfragekriterium erfüllen und für die das Recht zum Ansehen an den aktuellen Benutzer vergeben wurde.
Also:
SELECT * FROM pages WHERE foo=bar
Nun gibt es zwei Fälle für die Berechtigung:
- status ist 0 oder 1 -> ausgeben
- status ist 2 -> nur ausgeben, wenn entsprechende Berechtigung erteilt wurde
Da man also hier zwei Tabellen betrachten muss, habe ich einen JOIN verwendet
SELECT * FROM pages LEFT JOIN privileges ON pages.page=privileges.page WHERE foo=bar AND (status=0 OR status=1 OR (status=2 AND admin=xyz AND type>0))
Nun bleibt die Ausgabe aber zum Beispiel leer, wenn für eine Seite gar kein Recht vergeben wurde.
Stimmt mein Ansatz überhaupt?
Kann man das effizienter machen?
Wie bekomme ich das beschriebene Problem in den Griff?
Danke schonmal im Voraus
Sloothword
Tabelle pages
page: id der Seite
foo: ein Abfragekriterium
status: gibt an, ob die Seite öffentlich (status 0 oder 1) oder nur mit Berechtigung sichtbar ist (status 2). Ein Status von -1 bedeutet, dass die Seite nie zu sehen ist.
Tabelle authorisations
admin: gibt die id des Benutzers an
page: die Seitenid für die diese Berechtigung gilt
type: gibt an, ob der Benutzer die Seite sehen (type=1) oder bearbeiten darf (type=2)
Bsp:
admin | page | type
1 | 12 | 1
1 | 13 | 2
2 | 12 | 1
(Wie macht man hier Tabellen?)
Dies gibt an, dass Benutzer 1 Seite 12 und 13 ansehen darf, Benutzer 2 aber nur Seite 12.
Ein Eintrag mit type=0 steht genauso wie ein fehlender Eintrag für kein Recht zum Ansehen.
So nun zum eigentlichen Problem:
Ich möchte nun alle Seiten finden, die ein bestimmtes Abfragekriterium erfüllen und für die das Recht zum Ansehen an den aktuellen Benutzer vergeben wurde.
Also:
SELECT * FROM pages WHERE foo=bar
Nun gibt es zwei Fälle für die Berechtigung:
- status ist 0 oder 1 -> ausgeben
- status ist 2 -> nur ausgeben, wenn entsprechende Berechtigung erteilt wurde
Da man also hier zwei Tabellen betrachten muss, habe ich einen JOIN verwendet
SELECT * FROM pages LEFT JOIN privileges ON pages.page=privileges.page WHERE foo=bar AND (status=0 OR status=1 OR (status=2 AND admin=xyz AND type>0))
Nun bleibt die Ausgabe aber zum Beispiel leer, wenn für eine Seite gar kein Recht vergeben wurde.
Stimmt mein Ansatz überhaupt?
Kann man das effizienter machen?
Wie bekomme ich das beschriebene Problem in den Griff?
Danke schonmal im Voraus
Sloothword
Comment