Sven Rautenberg: Ideen zu Rechtesystem in PHP

Beitrag lesen

Moin!

Vielleicht erkläre ich doch nochmals genauer, wie sich die Rechte so zusammensetzen und warum sie sich evtl. gegenseitig ausschließen können.

Das ist hilfreich. :)

Grundsätzlich gilt: Man kann nur einer Gruppe angehören.

Eine wichtige Information. Bei Unix kann man als User z.B. mehreren Gruppen angehören. Sowas würde deinen Fall aber komplizierter machen.

Die grundsätzlichen Rechte sind:

  • beschränkt sehen
  • alles sehen
  • anlegen
  • editieren
  • löschen

Ausschließen würden sich hier logischer Weise beschränkt sehen und alles sehen, da sie gegenläufig sind. Darum hatte ich auch überlegt, ob man diese beiden Rechte evtl. zusammenfassen sollte.

Was ist da der Unterschied genau? Eigentlich ist "alles sehen" doch eine Erweiterung von "beschränkt sehen". Also könnte man das Recht "sehen" auf 0 (nichts sehen), 1 (beschränkt sehen) oder 2 (alles sehen) setzen. Meinetwegen auch binär auf 00 (nix), 01 (beschränkt) und 10 oder 11 (alles). Wenn man alles sehen darf, darf man auch beschränkt sehen, dieses eingeschränkte Recht ist in diesem Fall also irrelevant.

Im wesentlichen sind es eigentlich immer diese Rechte die sich in dieser Art verschiedenen Bereichen zuordnen lassen.

Diese Bereiche wären zum Beispiel:

  • Externe_Projekte
  • Interne_Projekte
  • Kundenkontakte
  • Lieferantenkontakte
  • News
  • Kalender
  • ...

Wenn es nicht mehr Elementarrechte wie oben angegeben gibt (5 Stück - vielleicht fallen dir insgesamt auch 8 oder 16 ein), dann kann man die im Prinzip in einer Integer-Darstellung verwurschteln. Was im Zusammenhang mit MySQL aber wesentlich netter wäre, ist die Definition des Elementarrechte-Feldes als SET, also als Menge. Diese kann man IMHO besser behandeln, und 5, 8 oder auch 16 verschiedene Rechte sind für dieses Datenfeld kein Problem. SETs nehmen bis zu 64 verschiedene Mengenelemente auf.

Und wie man der Doku entnehmen kann(http://www.mysql.de/doc/de/SET.html), arbeitet der Datentyp SET genau so, wie du es mit den Integer-Bits machen wolltest - nur etwas leichter menschenlesbar. Insbesondere die FIND_IN_SET-Funktion erscheint mir ganz nett, aber es ist auch grundsätzlich leichter lesbar, wenn du in der Rechte-Spalte nach 'WHERE recht LIKE "%readall%"' suchst.

Und diese Elementarrechte verknüpfst du mit jedem existierenden Bereich und jeder existierenden Gruppe so, wie ich schon vorgeschlagen hatte:

GID  Ort-ID  Rechte

Letztendlich werde ich wohl dann gruppieren nach den genannten Bereichen. Pro Bereich wird es nicht mehr als 10-15 verschiedene Rechtearten geben, daher macht es vielleicht Sinn pro Bereich einen LongInt zu verwenden und dann mit Bits zu arbeiten??

Wie gesagt: SET kann bis zu 64 verschiedene Elemente aufnehmen und verwaltet sie im Klartext. Das ist ein ganz kleinwenig mehr Overhead in der Datenbank (die schlauerweise wohl sofort in Binärdarstellung umrechnen wird), aber enorm erleichternd für die Programmierung.

- Sven Rautenberg

--
Signatur oder nicht Signatur - das ist hier die Frage!