Contao 4: Hack für "Angemeldet bleiben"

(Kommentare: 0)

In meiner Contao 4.4-Installation funktionierte das mit dem "Eingeloggt bleiben" bzw. "Angemeldet bleiben" nicht, obwohl der Cookie REMEMBERME gesetzt war. Es trat immer auf beim ersten Aufruf einer Seite im neu geöffneten Browser, erst beim zweiten Request funktionierte alles. Contao schien irgendwie zu wissen, dass jemand eingeloggt ist, aber nicht vollständig. Das Login-Formular für Gäste erschein korrekterweise nicht (weil nur für Gäste), aber die geschützten Elemente (also "Hallo User" und das User-Menü) wurden nicht angezeigt bzw. geschützte Seiten wurden nicht angezeigt.

Offenbar ist das Problem bekannt, für Contao 4.7 gemeldet und bearbeitet (github: "REMEMBERME only works once"), scheint aber auch in 4.9 wieder Thema zu sein (github: "Autologin / Rememberme for FrontendUser only works on second page load"). Offenbar kommt es auch in 4.4 vor.

Scheinbar hat es etwas zu tun mit der Reihenfolge, in der Symfony und Contao die Security / Login Issues behandeln. User ist zwar irgendwie eingeloggt, aber die Gruppen nicht korrekt zugeordnet...

 

Meine Lösung:

(Für 4.4, müsste so auch in 4.9 funktionieren, wenn das Problem dort weiter besteht, hab's dort noch nicht getestet...)
In einem Hook für getPageLayout prüfen, ob der Cookie REMEMBERME, aber kein FrontendUser (korrekt) vorhanden ist. Wenn ja, dann redirect auf die aufgerufene Seite. Denn beim zweiten Request funktioniert es richtig.

Mglw. geht es auch in einem anderen Hook (im Constructor meiner Hook-Hilfsklasse ging es nicht, das war offenbar zu früh im Prozess), ich habe diesen gewählt, weil er einer der "frühesten" ist und zum Zeitpunkt seines Aufrufs alles notwendige vorhanden ist aber noch kein Seitenteil gerendert, d.h. keine Funktionalitäten ausgeführt, die man mit diesem Hack am Ende zweimal ausführen würde.

 

Wenn man ein eigenes lokales Bundle integriert hat, kann man den Hook dort in einer seiner Klassen einbauen, wenn nicht, kann man es wie folgt in die TL_ROOT/system/config/localconfig.php einbauen. Code, der vor und nach den ### INSTALL...###-Zeilen steht, wird auch beim Speichern der Einstellungen im Contao-Backend beibehalten. So kann ich in die localconfig also auch eigene Klassen bzw. eine Hilfsklasse mit entsprechenden Methoden deklarieren und die Hooks definieren bzw. konfigurieren.

 

<?php

### INSTALL SCRIPT START ###
// leave all TL_CONFIG stuff unchanged here... ### INSTALL SCRIPT STOP ### $GLOBALS['TL_HOOKS']['getPageLayout'][] = array('\MyHooks', 'getPageLayout'); if (!class_exists('\MyHooks')) { // check because localconfig is called twice... class MyHooks extends \Contao\Controller { public static $instance = null; public static function getInstance() { if (!self::$instance) { self::$instance = new \MyHooks(); } return self::$instance; } public function __construct () { parent::__construct(); $this->import('\Contao\FrontendUser', 'User'); } public function getPageLayout($objPage, $objLayout, $objCallerPage) { // Possible hack / fix for problem that "REMEMBERME" function does not work properly on first page request: if (isset($_COOKIE['REMEMBERME']) && !$this->User->id && (!isset($_SESSION['remembermeredirect']) || $_SESSION['remembermeredirect'] <= 1)) { // If cookie is present but User not correct, then redirect, because for second request it works... // but remember it in session and do it only once, just in case the REMEMBERME cookie // points to a non existent user - which would lead to an endless redirect... $_SESSION['remembermeredirect'] += 1; self::redirect($_SERVER['REQUEST_URI']); } } } }

 

Scheinbar kann man das mit den eigenen Klassen und Hooks auch anders machen und eine Art Modul unter TL_ROOT/system einrichten (ähnlich Contao 3, siehe z.B. www.marcosimbuerger.ch: "Einen Contao HOOK einrichten" oder community.contao.org "Wie HOOKS anlegen unter Contao 4?"), habe das aber noch nicht probiert.

 

 

Zurück

Kommentare

Einen Kommentar schreiben