Die beste Methode zum Speichern von Benutzerberechtigungen?

8

Entwerfen einer ziemlich komplizierten Website mit viel Ajax auf einer einzigen Seite. Ich habe den Punkt erreicht, an dem einige Benutzer bestimmte Berechtigungen haben müssen, um etwas zu tun, und einige müssen von der Aktion gestoppt werden. Ich habe Benutzerrollen in meiner Datenbank eingerichtet und alles funktioniert gut, aber ich frage mich, ob es eine einfachere / sicherere Methode zum Speichern jeder Berechtigung gibt.

Momentan, wenn sich ein Benutzer anmeldet, werden seine spezifischen Berechtigungen aus der Datenbank abgerufen und in ein Session-Array geladen. Um zu überprüfen, ob der Benutzer berechtigt ist, überprüfe ich einfach, ob die Berechtigung im Array enthalten ist. Das scheint träge und fast so, als ob mir eine bessere Lösung fehlt.

Außerdem können Sitzungen scheinbar vom Benutzer bearbeitet werden ... Gibt es eine sicherere Methode?

Ich habe überlegt, für jede Prüfung eine Abfrage auszuführen, aber das könnte die Ladezeit für eine einfache Ajax-Anfrage erheblich verlängern.

Ich bin offen für alle Ideen. Danke.

    
Capt Otis 09.09.2010, 04:24
quelle

3 Antworten

20

In erster Linie kann der Benutzer Session-Variablen nicht bearbeiten. Das einzige, was auf dem Computer des Benutzers gespeichert wird, ist eine Sitzungs-ID. Diese ID wird dann vom Server verwendet, um Schlüssel / Wert-Paare abzurufen, die NUR auf dem Server gespeichert sind. Aus der Sicht eines Kunden ist es unmöglich, Werte aus einer Laune heraus zu ändern.

Zweitens würde ich mir keine allzu große Sorge um eine Datenbankverbindung machen. Vermeide es, dich zu wiederholen, aber mach dir keine Sorgen über die erste Verbindung.

Meine Lieblingsmethode zum Ausführen mehrerer Berechtigungen ohne Erstellen von Rollen besteht schließlich in der Verwendung von binärer Mathematik. Manche Leute mögen das, manche nicht, aber ich finde es nützlich.

Um diese Methode zu verwenden, definieren Sie die folgenden Werte:

%Vor%

Um Personen mehrere Berechtigungen zu geben, verwenden Sie binäres ODER

%Vor%

Um zu veranschaulichen, wie das funktioniert, können wir uns die Bits ansehen:

%Vor%

Um zu überprüfen, ob jemand eine Berechtigung hat, verwenden Sie binäre AND

%Vor%

Um zu sehen, wie das funktioniert, schauen wir uns die Bits wieder an

%Vor%

Der letzte Vorteil dieser Methode besteht darin, dass Sie mehrere Berechtigungen leicht in "Meta-Berechtigungen" kombinieren können

%Vor%

Benutze es, wenn du willst, aber es ist ein netter Trick in deinem Arsenal.

    
riwalk 09.09.2010, 04:53
quelle
1

Scheint OK für mich! Sie können sich eine Software anschauen, um Ihre Session-Chache-Performance zu verbessern.

Das Abfragen der Datenbank jedes Mal ist nicht so schlimm wie es klingt! Zum einen müssen Sie sich wahrscheinlich trotzdem mit der DB verbinden, zum anderen, wenn Sie die Benutzerberechtigungen bei der Anmeldung abgefragt haben, besteht die Chance, dass alle relevanten Zeilen im Puffer liegen und keine IO erforderlich ist, drittens eine Abfrage für eine einzelne Permission ein einzelner Benutzer wird viel leichter als eine Abfrage für alle Berechtigungen für einen Benutzer sein.

    
James Anderson 09.09.2010 04:32
quelle
-2

Ihre Erklärung des Modells scheint ein wenig verwirrt zu sein. Die Erlaubnis ist das Produkt der Subjektautorisierung und der Objektautorisierung. Lagern Sie diese Produkte wirklich für jede Kombination von Subjekt und Objekt? Das ist eine sehr ineffiziente Lösung und sehr schwer zu verwalten.

  

Auch Sitzungen können anscheinend vom Benutzer bearbeitet werden

WTF ????? !!!!

Sitzungsdaten sollten immer nur durch die Methoden geändert werden, die Sie in Ihrem Code definieren. Wenn Benutzer in der Lage sind, einen beliebigen Teil der Sitzungsdaten auf irgendeine Weise zu ändern, ist dies das erste Problem, das Sie ansprechen müssen - bis Sie das tun Es ist praktisch unmöglich, sich auf einen Teil Ihrer Authentifizierungs- / Autorisierungsmethode zu verlassen, es sei denn, Sie verschieben die Authentifizierung vollständig aus der Domäne Ihres Anwendungscodes (BTW: Dies ist nicht der richtige Weg, um das Problem zu beheben).

Sicherlich kann die Suche nach einem sehr großen Array (nicht sicher über den tatsächlichen Haltepunkt - aber in der Region von n = 1000 - aber es gibt viele Variablen, die dies beeinflussen) wesentlich langsamer sein als das Holen der Ergebnisse aus einer Datenbank.

>

Es ist schwer zu sagen, was Sie falsch machen, ohne zu verstehen, wie Ihr aktuelles System funktioniert. Ist es eines davon ?

    
symcbean 09.09.2010 12:54
quelle

Tags und Links