zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Rechteverwaltung mit MySQL und PHP

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 19.11.2007, 18:26
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard Rechteverwaltung mit MySQL und PHP

Hi,
ich stehe vor einer für ein Webprojekt wichtigen Entscheidung und will deshalb mal Fragen was Andere so davon halten:
Es geht um folgendes, ich will für eine Webseite (bei der es sich allgemein Gesagt um eine Multiuserdatenbankverwaltung handelt) die passende (also effektivste) Form einer Rechteverwaltung (bzw. Speicherung) finden.
Etwas Konkreter, auf der Webseite sollen sich verschiedene Nutzer anmelden und je nach ihren Rechten, bestimmte Bereiche ändern, neue hinzufügen, betreten oder nicht betreten können usw. Im Großen und Ganzen kommen erstmal mindestens so um die 20 verschiedene Rechte zusammen (wobei es sich aber noch nicht um das Ende handeln muss). Mein Problem ist nun wie ich die Benutzerspezifischen Rechte (es gibt zwar ein paar Gruppen dennoch soll es möglich bleiben die Rechte individuell einzustellen) am besten mit den Benutzern verknüpfe.
Zur Verfügung steht mir natürlich eine MySQL Datenbank und daraus ergeben sich mir auf den ersten "Blick" 3 Möglichkeiten:
1. Ich lege neben der Benutzer Tabelle eine zusätzliche Tabelle an mit folgender Strucktur:
USER_ID, RECHT1, RECHT2, usw...
wobei dann quasi jeden Nutzer EIN Datensatz in der Tabelle zugewiesen wird der die Rechte dann als Binäre Flags speichert.

2. Ich lege wieder eine zusätzliche Tabelle an die die Rechte aber in folgender Form speichert:
USER_ID RECHT_ID RECHT_WERT

Der Unterschied ist klar, auf diese Weise muss ich die Tabelle nicht jedesmal um eine Spalte erweitern um ein neues Recht hinzuzufügen. Nur das Auslesen der Rechte wird etwas auswändiger da ich so für jedes Recht jeweils eine Zeile Ausgraben muss d.h. ich muss erstmal alle Zeilen finde mit der Passenden User-ID.

3. Die letzte Möglichkeit die mir einfällt ist die das ich die konkreten Nutzereinstellungen nicht über Tabellen Speichere sondern über eine einzige Zahl die dann direkt in die User-Tabelle gespeichert werden kann die schon alle anderen Benutzer Daten wie Name,Passwort usw. enthällt.

Bei der RechteID vergabe achte ich darauf das die Ids entsprechend gewählt sind das ich die Rechteeinstellungen ähnlich der UNIX Dateirechte als einzelne Zahl erhalte wenn ich sie aufsummiere.
Der Nachteil ist nur der das ich sowohl beim Speichern als auch beim Lesen der Nutzerrechte diese Zahl ersteinmal durch einen kleinen Algorytmus zerlegen muss. Und naja, das neuimplementieren zusätzlicher Rechte ist ebenfalls nicht weiter schwer ich muss nur darauf achten das ich die höhere ID dann in den Algoritmen berücksichtige.


Was würdet ihr mir Raten, die erste Möglichkeit scheint mir die Effektivste zu sein, nur sollte ich vorher genau wissen welche Rechte ich vergeben will um nicht später umständlich Spalten an die Tabelle anfügen zu müssen, außerdem kann ich mir vorstellen das ich die Tabellen nicht mit hunderten von Spalten aufbauen kann/sollte (selbst wenn es mit sicherheit keine 100 Rechte werden)

Die zweite Möglichkeit wäre die Eleganteste aus meiner sicht, und wenn wir alle Quantencomputer benutzen würden (insbesonder die Server) dann würde ich diese auch benutzen, nur ist es mir gerade bei der Benutzerverwaltung wichtig das es wenn möglich keit unnötigen Performance Lücken gibt.

Geändert von braindead (19.11.2007 um 18:31 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 19.11.2007, 19:50
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 23.07.2007
Beiträge: 286
Chrunchy wird schon bald berühmt werden
Standard

Da du ohnehin an irgendeiner Stelle eine Definitionstabelle haben mußt, wo du die einzelnen rechte definierst, würde ich in der Usertabelle eine Spalte "Rechte" anlegen, wo ich die IDs der gegebenen Rechte durch ein Trennzeichen (z.B. Komma) hintereinander reich schreiben würde. Die rechte würde ich nach dem Login einfach direkt in ein Session-Array wandeln und hätte sie immer griffbereit.

Damit kannst du die Rechte beliebig erweitern und die brauchst dir um Tabellengrößen keine Sorgen machen.

Das ganze klappt nur nicht, wenn du keinen binäre Rechtestatus hast. Also entweder Recht Ja oder Nein, ein bisschen geht halt nicht.

HTH
__________________
Gruß Chrunchy

"Eine Theorie ist eine Vermutung mit Hochschulbildung" (James Earl Carter)
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 19.11.2007, 20:02
Benutzerbild von Timo
table-layout: none;
XHTMLforum-Kenner
 
Registriert seit: 11.11.2006
Beiträge: 5.345
Timo ist ein LichtblickTimo ist ein LichtblickTimo ist ein LichtblickTimo ist ein LichtblickTimo ist ein Lichtblick
Standard

Aber wenn man Rechte in einer Session speichert, hat man einen Nachteil: Wenn ich jemand ein Recht wecknehm muss der sich erst abmelden und wieder neu anmelden.

Sicherer ist, wenn es immer Live aus der DB gefragt wird.

Gruß
Timo
__________________
Um weitere Erklärungen eingeblendet zu bekommen, drücken Sie bitte die Tastenkombination Alt + F4
Mit Zitat antworten
  #4 (permalink)  
Alt 19.11.2007, 20:12
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 23.07.2007
Beiträge: 286
Chrunchy wird schon bald berühmt werden
Standard

Wenn du ein Recht entfernst, solltest du einfach die Session killen.
__________________
Gruß Chrunchy

"Eine Theorie ist eine Vermutung mit Hochschulbildung" (James Earl Carter)
Mit Zitat antworten
  #5 (permalink)  
Alt 19.11.2007, 20:24
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.733
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Du könntest auch das Unix-Dateirechtesystem übernehmen.
__________________
Markus Wulftange
Mit Zitat antworten
  #6 (permalink)  
Alt 20.11.2007, 00:20
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Gumbo Beitrag anzeigen
Du könntest auch das Unix-Dateirechtesystem übernehmen.
Das wäre ja die dritte Möglichkeit die ich mir schon überlegt hatte.

Prinzipiel kann ich nur sagen, ja ich habe natürlich eine Tabelle welche die Rechte definiert, und ja ich würde die Rechteeinstellung beim Login in jedem Fall in einen Session Array Schreiben, das ich die Rechte dann zur "Laufzeit" schlecht ändern kann ist eine andere Sache, das könnte ich in der Tat durch eine Beendung der Session regeln (wenn gleich mir noch nicht klar ist wie ich sowohl die Richtige Session finden als auch sie beenden kann, also ich will ja nicht auf jeder Seite bzw. bei jedem session_start immer prüfen ob die Session noch gültig ist, passender wäre es einfach mal direkt auf dem Server die Session gültigkeit auf ein paar Sekunden zu reduzieren, dafür muss ich die Session_Id aber kennen).
Die Idee die Rechte Ids in der User-Tabelle als ein String abzulegen wäre ja die dritte Möglichkeit abgesehen davon das ich sie jetzt wie beim UNIX-Dateisystem kodiert hätte, aber als einfacher Reihenstring ist es wohl einfacher zu handhaben, wenngleich er dann auch ziemlich lang werden könnte.

Wenn ich das richtig verstehe würde keiner sonnst zu den ersten beiden Möglichkeiten tendieren?
Mit Zitat antworten
  #7 (permalink)  
Alt 20.11.2007, 15:11
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 23.07.2007
Beiträge: 286
Chrunchy wird schon bald berühmt werden
Standard

Zitat:
Zitat von braindead Beitrag anzeigen
Wenn ich das richtig verstehe würde keiner sonnst zu den ersten beiden Möglichkeiten tendieren?
Beides würde zu Tabellen führen, die während der Projektlaufzeit in die Breite wachsen. Das finde ich äußerst ungünstig.
__________________
Gruß Chrunchy

"Eine Theorie ist eine Vermutung mit Hochschulbildung" (James Earl Carter)
Mit Zitat antworten
  #8 (permalink)  
Alt 20.11.2007, 16:26
Neuer Benutzer
neuer user
 
Registriert seit: 20.11.2007
Beiträge: 1
jumpa befindet sich auf einem aufstrebenden Ast
Standard

Moin!

Ich würde die Rechte in einer Tabelle speichern, und dann fügst du in der User Tabelle eine Spalte hinzu, mit dem Namen "user_rights"
Soll ein User Recht Nr. 1 & Nr. 3 haben, speicherst du in dieser Spalte den wert 2^1+2^3 = 10;

Wenn du nur wissen möchtest, ob der User das Recht Nr. 2 hat machst du folgendes:

10 & 2^2
wird zu
1010b & 0100b

Und ergibts "false";

Beispiel mit Recht Nr. 3
10 & 2^3
wird zu
1010 & 1000

Und ergibts "true"



Das hier sollte eine der einfachsten Methoden sein ....

Mein erster Beitrag
Mit Zitat antworten
  #9 (permalink)  
Alt 20.11.2007, 17:01
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.733
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Vielleicht hast du das Unix-Dateirechtesystem nicht ganz verstanden. Dort wird zwischen den Benutzerklassen „Eigentümer“ (owner), „Gruppe“ (group) und „andere“ (others) unterschieden, die jeweils unterschiedliche Zugriffsrechte haben können. Jede Datei besitzt nun neben diesen Attribute auch noch die Eigentümer-ID eine Gruppen-ID. Damit ist für jeden Benutzer zu bestimmen, ob er gewisse Zugriffsrechte hat oder nicht.
Im Gegensatz zu den anderen beiden genannten Modellen bleibt also die Anzahl der zu vergebenen Rechte proportional zur Anzahl der Dateien.
__________________
Markus Wulftange
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 20.11.2007, 19:08
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von jumpa Beitrag anzeigen
Moin!

Ich würde die Rechte in einer Tabelle speichern, und dann fügst du in der User Tabelle eine Spalte hinzu, mit dem Namen "user_rights"
Soll ein User Recht Nr. 1 & Nr. 3 haben, speicherst du in dieser Spalte den wert 2^1+2^3 = 10;

Wenn du nur wissen möchtest, ob der User das Recht Nr. 2 hat machst du folgendes:

10 & 2^2
wird zu
1010b & 0100b

Und ergibts "false";

Beispiel mit Recht Nr. 3
10 & 2^3
wird zu
1010 & 1000

Und ergibts "true"



Das hier sollte eine der einfachsten Methoden sein ....

Mein erster Beitrag
Das sieht ziemlich praktisch aus, so werde ich es machen, nur habe ich da gerade noch ein kleines Verständnisproblem, um die Rechte auszulesen muss ich die beiden Zahlen (Summe aller Reche und zu prüfendes Recht) in die Binärform wandeln, wie mache ich das in PHP und was genau tut der & Operator?
Ich vermute der liefert eine Binärzahl die nur die "bits" gesetzt hat die in beiden zu vergleichenden Zahlen gesetzt sind d.h. es liefert mir 0000 wenn das entsprechende Bit nicht besetzt ist? Wenn ja dann kann ich damit nur ein Bit prüfen also nicht zwei gleichzeitig? Nur bleibt noch das Problem wie ich die Zahlen in die Binärform wandele, oder macht das der & Operator schon?

Geändert von braindead (20.11.2007 um 19:10 Uhr)
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP zu MySQL Verbindungs-Fehler markuskoehler Serveradministration und serverseitige Scripte 16 29.04.2009 21:00
Usermaps per PHP und MySQL? R4V3N Serveradministration und serverseitige Scripte 6 28.01.2009 10:33
Dateien auslagern - Include und PHP ArcVieh Serveradministration und serverseitige Scripte 17 27.03.2008 19:09
Buchempfehlung für PHP und MySQL Einstieg Crizzo Ressourcen 4 04.08.2007 20:57
Gute Bücher? (PHP, mySQL, AJAX, [Perl, C(#)]) psycho_dmr Offtopic 4 24.03.2006 15:24


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:29 Uhr.