Moin!
Jetzt bin ich am überlegen, wie ich das am besten aufbaue, da mir eine Gruppentabelle nach dem Schema:
id | gruppenname | recht1 | recht2 | ... | recht50
nicht besonders gut gefällt wollte ich einmal nachfragen, ob jemand eine bessere Idee hat. Die Rechte schließen sich teilweise gegenseitig aus.
Das mit dem gegenseitigen Ausschließen klingt irgendwie nicht so gut. Was wäre das denn zum Beispiel für eine Konstellation.
Überhaupt: 50 einzelne Rechte sieht mir irgendwie danach aus, dass deine Umgebung diverse Einzelmanipulationen erlaubt oder verweigern soll. Da du leider nicht geschrieben hast, was das genau ist, kann ich nur meinen (möglicherweise die Lage vollkommen verkennenden) Tipp geben, die Dinge nach Möglichkeit zu gruppieren.
Also konkret: Ein einzelner User kann, genau wie bei den Dateirechten auch, gewisse elementare Dinge tun: Lesen, Schreiben, Ausführen. Naja, Ausführen macht bei dir vielleicht nicht unbedingt Sinn, aber Lesen und Schreiben durchaus. Also kann er keins, eines oder beides an einer bestimmten Position machen. Das würde die Rechte insgesamt reduzieren von "darf_lesen_hier: ja/nein" und "darf_schreiben_hier: ja/nein" auf "darf_hier: lesen/schreiben".
Dann kann man die Zugriffe auch über eine weitere Gruppe einschränken. Damit ein User an einer Position etwas darf, muß er einer bestimmten Gruppe angehören. Nun kann er natürlich mehreren Gruppen angehören - das sollte dann aber nicht in mehreren Spalten (bzw. eigentlich in sovielen Spalten, wie es Gruppen bzw. Orte gibt) abgebildet werden, sondern sich in der Tabelle als mehrere Datensätze widerspiegeln. Genauer betrachtet: Vergiß den Begriff "Gruppe" für dieses Konstrukt, mach pro Ort, an dem der User bzw. seine Gruppe mehr als "nichts"-Rechte besitzt, einen Datenbankeintrag in so einer Tabelle:
GID Ort-ID Recht
Da zu erwarten ist, dass noch mehr Orte hinzukommen, ist diese Tabelle erheblich flexibler. Abgefragt wird dann durch passende Joins auf die verbundenen Tabellen (also z.B. über die GID und die Ort-ID). Und da nicht zu erwarten ist, dass eine solche Abfrage bei der Klärung, ob ein User aktuell etwas darf oder nicht, mehr als eine UID/GID und Ort-ID hat, dürften die zu bewegenden Datenmengen ziemlich klein sein - maximal eine Ergebniszeile, wenn ein Recht gegeben ist, sonst keine Zeile. Mit passenden Indexen auf den relevanten ID-Spalten sollte das kein Thema sein.
Sondern dies evtl. zusammenzufügen zu einer Spalte Projekte und hier einen longint zu setzen in dem ich jeweils bits setze für die einzelnen Rechte.... bin mir aber nicht ganz sicher wie das in PHP geht und wie sicher es ist.
Ein Longint ist längenmäßig begrenzt. Das kann zu einem Problem werden. Außerdem ist er zwar schnell gelesen, und die Auswertung der gesetzten Rechte ist durch Bitmasken auch ganz simpel, aber eben nicht offensichtlich, weshalb es da durchaus zu Programmierfehlern kommen kann. Ganz grundsätzlich jedoch beeinflußt die Art der Datenspeicherung die Sicherheit nicht - es ist vollkommen egal, ob ein Bit als Bestandteil eines Longint oder eines Strings oder eines Bool-DB-Feldes gespeichert ist.
- Sven Rautenberg
Signatur oder nicht Signatur - das ist hier die Frage!