Rechtesystem für meine Website?
Hi liebe Community!
Ich möchte auf meiner Webseite ein Rechtesystem realisieren, jedoch bin ich mir nicht sicher, was die optimalste Lösung dafür ist. Es geht darum, dass wenn ich überprüfen will, ob ein User eine bestimmte Aktion durchführen darf, einfach überprüfe, ob diese Berechtigung für diesen User freigegeben ist. Meiner Meinung nach wäre es nicht gerade sinnvoll, für jede Berechtigung ein Attribut in einer Datenbank zu erstellen, da es bei Änderungen zu viel Aufwand gäbe. Kann mir da jemand einen Tipp geben, wie ich so etwas am besten mache?
Danke im Voraus
Pfuffi
5 Antworten
Hi,
also wenn du tatsächlich eine Seite von Grund auf erstellen willst mit Nutzer basiertem Berechtigungssystem, hast du einen weiten Weg vor dir. Eventuell ist es sinnvoller auf ein CMS zurückzugreifen.
Je nach Anwendung bietet sich Drupal (sehr mächtige = hohe Einarbeitungszeit) oder Wordpress (etwas weniger mächtig = schneller Einstieg) + Members (ein Plugin).
Nun aber zur eigentlichen Frage:
um das ganze wirklich professionell und Zukunftsfähig zu gestalten benötigst du mehrere Tabellen:
- User (sollte ja sowieso schon vorhanden sein)
- Roles (Benutzerrollen zur Rollen basierten Rechtevergabe)
- User-Roles (Zuordnung von Usern zu Roles)
- Role-Permissions (Zuordnung von Roles zu einer Berechtigung)
- (User-Permissions) (Zuordnung von Berechtigungen zu einem User)
Die Struktur solltest du einfach so aufbauen:
Nur Rechte die freigegeben sein sollen werden in der Datenbank gespeichert, solltest du eine neue Berechtigung einführen hat also zunächst keiner Zugriff darauf. Benutzerrollen sollten immer weniger oder gleich viele Berechtigungen besitzen wie ein zugeordneter User.
Mit irgendeiner festen Rechtestuktur, womöglich noch mit einer Bit-Struktur wirst Du m.E. nicht froh.
Standard für solche Zwecke ist eine Kombination aus Tabellen ähnlich wie von sawaswolf vorgeschlagen:
User
Roles
Rights
User_Roles
Roles_Rights
Wenn Du bei einer solchen Struktur Probleme mit der Funktion hast, ist es auch ganz einfach in irgendeinem Programmierforum Hilfe zu holen, jeder, der etwas Ähnliches schon mal gemacht hat, wird die Struktur verstehen.
Meiner Meinung nach wäre es nicht gerade sinnvoll, für jede Berechtigung ein Attribut in einer Datenbank zu erstellen, da es bei Änderungen zu viel Aufwand gäbe.
Programmieren wird in diesem Fall zur Fleißaufgabe. Das geht nicht anders. Woher soll der Rechner oder die Webseite sonst erfahren, wer was darf?
Wenn man sich Unix, Linux, Windows, OS X … ansieht, kann man auch dort bestimmte Zugriffsrechte auf dem Computer festlegen. Dort ist dies im Prinzip ebenso implementiert. Da konnten die Systemprogrammierer auch nicht klagen, dass dies „viel Arbeit“ ist.
Prinzipiell ist der Computer immer mehr oder weniger auf unsere Eingaben angewiesen. Also mußt du die Rechte einzelner Nutzer deiner Seite auch einzeln setzen. Der Computer kann das nicht!
jede stelle gilt für einen bereich . wie beim unix dateisystem
und dann
kannst du es mit BIT operatoren machen
000010
und dann mit AND und einer MASKE gucken ob es war wird
000010
&& (BIT AND)
111111
gleich
000010
also WERT AND MASKE == 000010
entsprechend gibts natürlich Dezimal
also
(2 && 255 == 2) ergibt TRUE
(3 && 255 == 2) ergibt FALSE
Je nachdem wie aufwendig sein Projekt überhaupt ist . Bringt ja auch nichts wie oben gleich mit X Tabellen anzufangen wenn er nur paar Rechte braucht . Also ist es keine schlechte Idee sondern ein Anwendungsfall . Für meine Zwecke wäre Deins eine schlechte Idee ;)
Danke für deine Antwort! Da ich mich nicht mit BIT-Operatoren auskenne, habe ich nicht gerade sehr viel Ahnung, wie deine Methode zu realisieren ist. Eine etwas einfachere Erklärung wäre sehr nett, damit auch ich es begreifen kann. ^^
gibt natürlich einige operatoren um genau die richtigen werte und kombies zu prüfen .
das beispiel ist schlecht gewählt
normal wenn du das da oben also 0000010 prüfen willst wäre richtig
2 && 2 == 2 = TRUE
3 && 2 == 2 = FALSE
mit der obrigen maske kannst du gucken ob z.b. alle werte gesetzt sind
also
255 && 255 == 255 = TRUE
3 && 255 == 255 = FALSE
na fällt dir was auf ;)
und mit anderen operatoren kannst du dann auch einzelne oder mehrere bits auf einmal setzen
Hallo!
Hast du schon eine Datanbank angeschlossen?
Dann mache es mit einer Tabelle in der Datenbank.
Berechtigungen sind doch eher statisch -- (1: alles, 2:etwas 3: etwas weniger
und 4: gar nix).
Und jedem User (die ja wohl in der Datenbank sind) ein Attribut für Berechtigungen geben -- natürlich ist eine Änderung immer aufwendig, aufwendiger als keine Änderung.
(new Berechtigung = UPDATE TABLE USER SET Berechtigung = 4 WHERE USER = 'pfuffi')
Aber die Berechtigung gehört zum User, ich sehe auch keine andere, sinnvolle Möglichkeit.
Gruß
Das wäre meiner Meinung nach die einfachste Methode, jedoch ist diese auch unpräzise. Was, wenn ich jede einzelne Aktion, die der User (oder die Gruppe) durchführt, kontrollieren möchte? In diesem Fall ist diese Methode ungeeignet, oder nicht? :)
"unpräzise" verstehe ich nicht, die Berechtigung (ist im Beispiel) entweder 1 oder 2 oder 3 oder 4, und irgendwie musst du ja auch jeder Aktion eine Berechtigung geben (diese Berechtigung brauche ich mindestens) , und das über prüfen machst du ja nicht von Hand
z.B. vor jeder Aktion
SELECT Berechtigung From USER;
IF USER.Berechtigung < AKTION.Berechtigung THEN <USER darf>
ELSE <USER darf nicht>
Kleine Anmerkung:: auch ich verwende manchmal noch Bit-Masken, aber ganz bestimmt nicht bei Web-Seiten (Bitmaske muss auch in die Datenbank) -- im allgemeinen halte ich Bitmasken gür veraltet bei den heutigen Rechnerumgebungen.
Gruß
Wenn ich Solch eine Tabellenstruktur erstelle, wie würde dann die abfrage der Berechtigungen aussehen? Verstehe ich das so richtig?:
SELECT * FROM Perm_per_User WHERE userID = 4 AND permissionID = 25
Und wenn die Anzahl rows>0 ist, dann ist dem User den Zugriff gewährt?
(Natürlich sind die IDs nur im Beispiel als Zahlen festgelegt)
Ist eine schlechte Idee. Insbesondere wenn Rollen wegfallen oder mehrere dazukommen reichen dir Int und Long schnell nicht mehr aus und du speicherst als Text ab. Wartungsfreundlich ist das auch nicht.