Methoden zur Verwaltung von Sitzungsvariablen

8

Ich habe die letzten Tage auf den (mysql) Triggern gelesen ... ich versuche gerade, eine gute Methode zum Aktualisieren der Informationen eines Benutzers herauszufinden.

Der Fall, der dafür verwendet wird, bezieht sich auf ein Benutzerverwaltungssystem: Nehmen wir zum Beispiel einen admin Benutzer, der einen regular Benutzer zu einem manager aktualisiert, dann würde dieser Benutzer type change dann enable|disable Software-Features auf der Benutzeroberfläche haben.

Problem: Sie werden nichts über diesen Benutzer type change wissen, wenn Sie die Datenbank nicht abfragen und zum Beispiel die Variable $_SESSION['user']['type'] zurücksetzen und / oder der Benutzer sich vom System abmeldet.

Frage: Gibt es irgendwelche guten Methoden, um diese Kopfschmerzen zu lösen?

    
Jordan Davis 12.05.2016, 11:48
quelle

8 Antworten

4

Ich denke nicht, dass mysql Auslöser hierfür ideal sein würden . Warum? Weil Sie höchstwahrscheinlich mit einem Teil der Logik in PHP und einem Teil in MySQL enden werden. Es ist eine gute Sache, bei einer Technologie zu bleiben, weil es für Sie und Ihre Kollegen später einfacher ist, den Code zu warten / zu debuggen.

Wenn in Ihrem Fall die Änderung der Benutzerrolle sofortige Maßnahmen erfordert, müssten Sie entweder die Benutzerrolle bei jedem Skriptlauf laden oder den Benutzer mit einem Flag in der Datenbank abmelden, das signalisiert, dass seine Sitzung nicht ausgeführt wird gültig (oder Sie könnten Ihre eigene session_set_save_handler ) implementieren, die die Sitzung speichern würde irgendwo in der Datei, wo Sie es löschen können, um den Benutzer auszuloggen).

Es hängt von Ihren Bedürfnissen ab, welche Lösung besser zu Ihrem Fall passt.

  • Wenn Ihre Rollen Logik kompliziert sind und sie aus mehreren Rollen bestehen, die einem Benutzer zugewiesen sind, sowie zusätzlichen Berechtigungszuweisungen / -ausschlüssen pro Benutzer, sollten Sie einmal auf Benutzer überprüfen Melden Sie sich an und merken Sie sich das Ergebnis mit der Sitzung.
  • Wenn bei jedem Skript nach Berechtigungen sucht kein Problem ist , können Sie es tun . Beachten Sie jedoch, dass es aus Sicherheitsgründen ratsam ist, den Benutzer zur erneuten Anmeldung zu zwingen.
  • Wenn der Benutzer Abmelden zu Verlust der Arbeit führt, sollten Sie sich den Benutzer selbst abmelden und nach der nächsten Anmeldung neue Berechtigungen erteilen (Sie können dem Benutzer eine Nachricht anzeigen, dass neue Berechtigungen auf die Anmeldung warten, damit sie wirksam werden).

Es hängt also wirklich von Ihren Bedürfnissen ab, ob es besser ist, den Benutzer auszuloggen, ihm sofort neue Berechtigungen zu geben oder bis zur nächsten Anmeldung zu warten.

    
Buksy 19.05.2016, 22:39
quelle
2
  

Frage: Gibt es irgendwelche guten Methoden, um diese Kopfschmerzen zu lösen?

Finden Sie gute Gründe, es nicht zu tun!

Das hört sich vielleicht wie ein Witz an, aber ich meine es ernst. Sie müssen Folgendes beachten:

  • Was ist der Wert dieser Funktion?
  • Lohnt es sich Kopfschmerzen ?
  • Was sind die Risiken dieser Funktion (unvollständige Arbeit / Systemkonsistenz)?
  • Müssen Sie den Systemkern ändern?
  • Müssten Sie das System erneut validieren?
  • Gibt es andere wirklich großartige Funktionen (Systemverbesserungen), die darauf warten, implementiert zu werden?

Wer diese Fragen nicht beantworten kann, braucht diese Funktion nicht wirklich.

Finde einfache Alternativen:

  • Rufen Sie den Benutzer an und bitten Sie sich abzumelden.
  • Benachrichtigen Sie den Benutzer per E-Mail.
  • Geben Sie eine Schaltfläche für die E-Mail-Benachrichtigung an.
  • Senden Sie die E-Mail-Benachrichtigung automatisch, nachdem Sie die Berechtigungen geändert haben.

Das ist keine Faulheit. Konzentriere dich nur auf den wahren Wert.

    
Paul Spiegel 22.05.2016 20:27
quelle
1

Eine Alternative wäre das Ausführen von ajax-Anfragen mit einem gewissen Zeitintervall, die Ihren Benutzer $ _SESSION aktualisieren. Wenn Sie Änderungen an Ihrem 'type' vornehmen, können Sie tun, was Sie wollen, z. B. erzwingen, dass der Benutzer Ihre Anwendung erneut anmeldet, oder nichts anderes tun, als $ _SESSION-Informationen zu aktualisieren. Natürlich müssen Sie wissen, ob Sie diese Informationen wirklich benötigen, bevor der Benutzer sich beim nächsten Mal abmeldet und anmeldet, mit einem aktualisierten Profil.

    
Felippe Duarte 18.05.2016 20:50
quelle
1

Ich denke, das Speichern Ihrer Sitzung in Caching-Mechanismen wie Redis würde Ihnen einen zusätzlichen Vorteil verschaffen. Es ist leichter als das Speichern von Sitzungsdaten in der Datenbank. Sie können Cluster sehr einfach erstellen. Klicken Sie auf hier um die Beispielimplementierung zu sehen.

Sobald sich ein Benutzer "type" ändert, können Sie den redis-Datencache laden und nach Ihren Wünschen aktualisieren.

    
Anirudha Kasralikar 23.05.2016 10:05
quelle
0

Ich denke, der sicherste Weg, dies zu tun, und der, den ich wählen würde, ist der "Kopfschmerz" Weg.

  1. 'normaler' Benutzer A meldet sich an und öffnet die Sitzung A1.
  2. 'admin' Benutzer aktualisiert A zu einem 'Manager'.
  3. Momentan ist Sitzung A1 eine gültige Sitzung, gewährt dem Benutzer jedoch keine 'Manager'-Privilegien.
  4. Wenn sich Benutzer A abmeldet und sich wieder in Sitzung A2 anmeldet, gewährt diese Sitzung dem Benutzer nun alle Privilegien eines 'Managers', nachdem er den aktuellen 'Typ' aus der Datenbank nachgeschlagen hat.

Alternative, die abhängig von Ihrer Anwendung etwas teuer sein kann:

Jedes Mal, wenn ein Benutzer ein Sitzungstoken vorlegt, überprüfen Sie anhand der Datenbank die Gültigkeit der Sitzung. Wenn diese Sitzung ungültige Informationen enthält (dh der 'Typ' stimmt nicht mehr überein), erzwingen Sie, dass sich der Benutzer erneut anmeldet.

Eine weitere Alternative hinzufügen:

Verwenden Sie keinen MYSQL-Trigger, wenn der Anwendungsaufrufer (der Administrator) den "Typ" von Benutzer A aktualisiert, er ruft auch an, wo Sie die Sitzungen zwischenspeichern, und entweder (a) aktualisiert die Sitzung (nicht empfehlenswert) ) oder (b) macht die Sitzung ungültig und zwingt den Benutzer, sich erneut anzumelden.

* Beachten Sie, dass alle diese Lösungen erfordern, dass der Benutzer seine Anmeldeinformationen erneut eingibt, nachdem er die "Manager" -Macht neu gefunden hat, bevor er Zugriff auf das "Manager-Zeug" hat. Ich denke, das ist sicherer, als die Sitzung ohne Authentifizierung zu aktualisieren.

    
Daniel Patrick 16.05.2016 18:32
quelle
0

Meine empfohlene Methode wäre, die type jedes Benutzers in der Datenbank zu speichern. Die Probleme, die auftreten würden, wenn Sie sich entscheiden würden, type als Sitzungsvariable zu speichern, wäre (unter anderem):

  1. Nach Ablauf der Sitzung gehen diese Informationen verloren. Normalerweise dauern die Sitzungen 30 Minuten, obwohl Sie dies so lange ändern können, wie Sie möchten. Wenn Sie jedoch eine Sitzung erstellen, die einen Monat lang dauert, wird jeder, der Zugriff auf diesen Benutzercomputer hat, im Benutzerkonto angemeldet, ohne dass ein Kennwort verwendet werden muss.

  2. Sie könnten keine leistungsfähigen Abfragen verwenden, die von Datenbanken angeboten werden (wie zB MySQL, das SQL verwendet). Wenn Sie Ihre Informationen in Sitzungen speichern, können Sie sicher sein, dass Sie jede Benutzerinformation 1 für 1 nachschlagen können, aber warum sollten Sie das Rad neu erfinden? Es ist nicht einfach, eine Datenbankstruktur von Grund auf neu zu entwickeln, ich würde es daher nicht empfehlen.

Was Ihre Bedenken bezüglich des Zugriffs auf eine Datenbank anbelangt, nachdem die Informationen aktualisiert wurden, würde ich nicht sagen, dass diese Informationen so bedenklich sind, wie Sie es für möglich halten. Stellen wir uns die folgenden Beispiele vor:

1)

Wenn ein Benutzer zum Beispiel momentan Manager ist und eine Website lädt, auf der er mächtige Aktionen ausführen kann, wird er gleich danach als normaler Benutzer degradiert Diese Information in der Datenbank zu haben würde perfekt funktionieren. Wenn der Benutzer versucht, seine Kräfte zu nutzen (die nicht mehr seine sind), würde er auf eine Schaltfläche klicken, die eine Anfrage an die Datenbank senden würde, um seine type zu bestätigen. Datenbankabfragen sind sehr schnell, Geschwindigkeit ist also kein Problem. Ich wäre mehr besorgt über die Geschwindigkeit, die Sie benötigen, um Informationen von einer Sitzungsvariablen als von der Datenbank zu erhalten.

2)

Wenn sich der Benutzer auf einer Seite befand, während er ein normaler Benutzer war, und während er auf der Seite war, wurde er Manager , dann konnte er seine Befugnisse ausüben nach dem Aktualisieren der Seite. Ich meine, wenn Sie Sitzungen verwendet haben und die Seite die Informationen automatisch mit etwas wie AJAX abrufen und dann seine Optionen auf der Seite aktualisieren sollte, würde das viel mehr Serverleistung verbrauchen als eine einfache Aktualisierung.

Um ein einfaches SELECT * FROM myTable WHERE id = 4 zu erhalten, kann es nur 1 Millisekunde dauern, bis es in einer Datenbank ausgeführt wird. Datenbanken wurden speziell auf ihre Geschwindigkeit ausgelegt, weshalb sie bevorzugt werden.

JEDOCH , vielleicht haben Sie keinen Zugriff auf eine Datenbank und suchen deshalb nach einer Alternative? Nun, du hast Glück! MySQLi ist eine Datenbank, die nur eine Datei zum Speichern der Informationen verwendet. Es wurde speziell für Benutzer entwickelt, die wenig Ressourcen haben und viele der Fähigkeiten haben, die MySQL hätte.

    
Webeng 22.05.2016 07:07
quelle
0

Da jeder Benutzer ein role oder type hat, bedeutet dies, dass die Fähigkeit, Inhalte in Ihrer Anwendung anzuzeigen oder zu bearbeiten, mit diesem Faktor fest verbunden ist. Dies bedeutet, dass die 2 grundlegenden Dinge, die Ihre Sitzungsvariablen haben sollten, userID und userType sind, die Sie auch in Ihrer Datenbank speichern sollten

Diese Informationen können beispielsweise als kleines Array an $_SESSION['user'] übergeben werden, wobei Ihr Array-Schlüssel der userID und der userType der Wert sein kann.

%Vor%

Sobald Sie sich angemeldet haben, werden Ihre anfänglichen Werte in session gespeichert. Damit Ihre Anwendung weiß was userA in Ihrer Anwendung anzeigen oder bearbeiten kann, führen Sie in Ihrem Skript im Grunde einen Vergleich mit dem userType durch, das userA hat. Aber um zu erreichen, was Sie wollen, müssen Sie die Information am Anfang jedes VIEW/PAGE Ihrer Anwendung im Grunde wieder holen. Wenn% userType userA zugewiesen wurde, zeigen Sie einfach eine Nachricht an, dass er / sie sich automatisch in 15 Sekunden abmeldet (geben Sie ihm Zeit, die Nachricht selbst zu lesen), damit die Änderungen wirksam werden. Während Ihr Benutzer diese Nachricht sieht, nehmen Sie die aktuellen Sitzungsdaten, die er / sie hat, in der Datenbank auf, da einige Sitzungsvariablen bei einem Upgrade oder Downgrade von userType verfügbar sind (oder nicht). Indem Sie den Vergleich der userType am Anfang jeder VIEW/PAGE Ihrer Anwendung platzieren, ersparen Sie sich die Kopfschmerzen, dass ein Benutzer Daten verlieren kann.

    
Peter Darmis 22.05.2016 07:44
quelle
-1

Wenn Ihre Skripte $_SESSION['user']['type'] verwenden, um über die Benutzerprivilegien zu erfahren, würde ich einfach ihren Wert ändern. Oder habe ich das Problem nicht verstanden?

    
Rosh Donniet 12.05.2016 12:15
quelle