Nach Login die "richtige" Seite anzeigen lassen
am 21.05.2016 - 12:41 Uhr in
Hallo zusammen,
der Betreff ist zugegeben nicht besonders gut, deshalb hier eine kurze Beschreibung eines Szenarios:
Der User bekommt eine Mail mit einem Link zu eine Seite, die einen Login erfordert.
Er klickt den Link und kommt folgerichtig auf die Seite: Access Denied, die einen Link zum Login enthält. Er klickt auf den Login und gibt Username und Passwort ein. Jetzt möchte ich, dass der User auf die Seite weitergeleitet wird, die er ursprünglich aus der Mail geklickt hat.
Eigentlich ein ganz üblicher Vorgang, aber wie kann man das machen ?
Mir ist das Module Login Destination (https://www.drupal.org/project/login_destination) bekannt und es ist klar, dass man die Seite, auf die nach dem Login weitergeleitet wird, auch durch ein kleines PHP Script festlegen lassen kann. Zur Zeit mache ich es so, dass ich das Database Logging eingeschaltet habe und deshalb in der watchdog Tabelle der „Access Denied“ mitgeloggt wird. Ich lese also aus der watchdog-Tabelle den neuesten Eintrag mit Access Denied aus, und da steht drin, wo der User tatsächlich hinwollte. Das klappt natürlich nur, wenn nicht zwei User ungefähr gleichzeitig auf die Access Denied Seite geschickt werden, denn ich lese ja nur den neuesten Eintrag aus der watchdog Tabelle aus.
Gibt es einen besseren Weg ? Wie kann man sonst noch feststellen, welche Seite ein Benutzer sehen wollte, der auf die Access Denied Seite kommt ?
- Anmelden oder Registrieren um Kommentare zu schreiben
Bei Drupal habe ich es noch nicht probiert
am 21.05.2016 - 19:15 Uhr
aber du musst den Referer abfangen.
Dort steht drin, wer den access denied ausgelöst hat, und an den musst du es dann weiterleiten.
Aber wenn ich mich recht entsinne, gibt es dafür irgend ein Modul.
Eventuell im Paket von commerce?
Hallo Ronald, den Referer
am 21.05.2016 - 21:11 Uhr
Hallo Ronald,
den Referer abfragen halte ich für keine gute Idee....
zum einen kann man den übermittelten Referer im Browser einstellen, soweit ich das weiß.
Zum anderen muss man damit rechnen, dass der User auf der Login-Seite (dort sind ja meist noch weitere Reiter drauf, wie "create a account" oder "Request new Password") noch andere Links klickt, bevor er sich tatsächlich einloggt.
@commerce
guter Tipp, ich schaue mir da mal die Module an, vielleicht ist ja wirklich was dabei.
Hat denn sonst noch einer eine Idee ? Ich finde, das ist doch ein Standardproblem, welches ich oben beschrieben haben.
Gruß
Berthold
das geht doch mit rules
am 22.05.2016 - 05:10 Uhr
das geht doch mit rules
Hallo Christian, deine
am 22.05.2016 - 14:40 Uhr
Hallo Christian,
deine Antwort ist ja sehr kurz, und erst dachte ich: Klar geht eine Weiterleitung mit Rules nach dem Login, aber wohin war ja die Frage.
Dann habe ich noch ein bisschen darüber nachgedacht und HEUREKA, ich habe eine Lösung gefunden.
Ich skizziere das mal kurz für alle anderen:
folgende Rule erstellen:
Event: System log enty is created
Conditions: Data comparison
log-entry:type ist gleich access denied
Action: PHP Code: Speichere die $log_entry['message'] in der Session ab.
($log_entry['message'] ist die Seite, auf die der User eigentlich wollte)
Dann eine weitere Rule:
Event: User has logged in
Action: PHP Code:
Aus der Session die NID auslesen
ist da was drin, Session Variable löschen und dorthin weiterleitet
ist da nichts drin,
wie immer auf die Account Seite weiterleiten
Funktioniert wie geschnitten Brot.
Also nochmals Danke für den Denkanstoß :-)
Gruß
Berthold
Vllt. hilft LoginToboggan
am 22.05.2016 - 21:48 Uhr
Wenn man den Standard-Login-Block nicht nutzen mag, der bei Access-Denied auch zurück zur Seite führt hilft vlt. das
Modul LoginToboggan, das eine Funktion "Present login form on access denied (403)" hat.
Wenn es kein direktes Formular auf der 403-Page sein soll, würde ich eher versuchen einen Link dort zu platzieren, der die Destination an das Login-Formular übergibt. Da gibt es vllt. auch ein Modul für und wenn nicht, ist das leicht zu programmieren in einem Custom Module.
Sicherlich würde
am 23.05.2016 - 00:01 Uhr
Sicherlich würde LoginToboggan auch funktionieren, aber das eigentliche Problem: Wie weiss ich, auf welche Seite der User wollte, wenn er die Access-Denied Seite angezeigt bekommt, löst es natürlich nicht.
Ich habe ja oben schon einen Weg aufgezeigt, wie man das machen kann, siehst du dort irgendwelche Probleme mit meiner Lösung ?
Gruß
Berthold
Erstmal hook_user_login probieren und PHP Filter vermeiden
am 23.05.2016 - 09:03 Uhr
Es geht also auch um die Dokumentation dessen, auf welche Adresse, welcher User uneingeloggt zugreifen wollte?
Grundsätzlich ist Dein Ansatz, die Session dafür zu benutzen nach dem Einloggen ein Weg, den ich auch erstmal ins Auge fassen würde. Nur kann man das ja auf unterschiedliche Weise machen.
Ich würde erstmal versuchen zu schauen, ob ich mit hook_user_login weiter komme, bevor ich per Hook (auch indirekt über Rules) das ganze Logging verlangsame. Falls das doch nötig sein sollte, wäre evtl. ein direkter Zugriff sinnvoller als per Rules auch aus Performance-Gründen.
Und wenn Rules ein sinnvoller Weg ist, würde ich dort nicht mit dem PHP-Filter arbeiten, bei dem der Code in der Datenbank gespeichert wird. Das lässt sich schlecht warten und der PHP-Filter sollte nach Möglichkeit aus Sicherheitsgründen auch komplett unterbunden werden.
Hast du das mal angesehen?
am 23.05.2016 - 10:28 Uhr
https://www.drupal.org/project/smart_login