Laravel hat session.lifetime auf Benutzerebene angepasst

Lesezeit: 4 Minuten

Benutzer-Avatar
deej

Ich überschreibe session.timeout Wert in einer der Middleware (für die Laravel-Web-App), aber es scheint keinen Einfluss auf das Timeout einer Sitzung zu haben. Wenn ich jedoch debugge, wird der Wert angezeigt, den ich überschrieben habe.

Config::set('session.lifetime', 1440);

Der Standardwert ist wie folgt:

'lifetime' => 15,

Die Website, an der ich arbeite, hat für die meisten Benutzer eine sehr kurze Sitzungslebensdauer, aber für ausgewählte Benutzer möchte ich eine längere Sitzungslebensdauer bereitstellen.

  • Irgendeine Lösung gefunden?

    – Jay Pandy

    15. November 2017 um 10:57 Uhr

  • Am Ende habe ich verwendet github.com/maxfierke/jquery-sessionTimeout-bootstrap, das ist eine Javascript-Lösung, die Benutzern eine automatische Abmeldung bietet. Sie können eine benutzerdefinierte Zeit pro Benutzertyp festlegen und sie bei ihrer jeweiligen Zeitüberschreitung abmelden lassen. Ihre session.lifetime darf das Maximum eines beliebigen zulässigen Session-Timeouts sein.

    – deej

    29. Dezember 2017 um 22:05 Uhr

Benutzer-Avatar
Levi

Es scheint die einzige Möglichkeit zu sein, eine Dynamik zu erreichen lifetime Wert, ist durch Festlegen des Werts in der Middleware, bevor die Sitzung initiiert wird. Andernfalls ist es zu spät, da der SessionHandler der Anwendung bereits mit dem Standardkonfigurationswert instanziiert wurde.

namespace App\Http\Middleware;

class ExtendSession
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, $next)
    {
        $lifetime = 2;
        config(['session.lifetime' => $lifetime]);
        return $next($request);
    }
}

Fügen Sie dann in der Datei kernel.php diese Klasse vor hinzu StartSession.

\App\Http\Middleware\ExtendSession::class,
\Illuminate\Session\Middleware\StartSession::class,

  • Danke @levi für die Antwort auf diese alte Frage, ich habe mich für etwas anderes entschieden, aber noch keine Middleware ausprobiert. Aber erscheint mir logisch. Vielen Dank.

    – deej

    25. März 2019 um 20:50 Uhr

Benutzer-Avatar
Ryan

Folgendes hat bei mir funktioniert (mit Laravel 5.6 oder 5.5) um einen Benutzer die Sitzungsdauer zum Zeitpunkt der Anmeldung wählen zu lassen.

Das Bearbeiten der Lebensdauer der Sitzung im Auth-Controller funktioniert nicht, da bis dahin Die Sitzung ist bereits gestartet. Sie müssen Middleware hinzufügen, die ausgeführt wird, bevor Laravel seine eigene „StartSession“-Middleware ausführt.

Eine Möglichkeit besteht darin, ein Cookie zu erstellen, um die Präferenz des Benutzers für die Lebensdauer zu speichern und diesen Wert zu verwenden, wenn der Sitzungsablauf für jede Anfrage festgelegt wird.

  1. Neue Datei: app/Http/Middleware/SetSessionLength.php
namespace App\Http\Middleware;

use Illuminate\Support\Facades\Cookie;

class SetSessionLength {

    const SESSION_LIFETIME_PARAM = 'sessionLifetime';
    const SESSION_LIFETIME_DEFAULT_MINS = 5;

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, $next) {
        $lifetimeMins = Cookie::get(self::SESSION_LIFETIME_PARAM, $request->input(self::SESSION_LIFETIME_PARAM)); //https://laravel.com/api/6.x/Illuminate/Support/Facades/Cookie.html#method_get
        if ($lifetimeMins) {
            Cookie::queue(self::SESSION_LIFETIME_PARAM, $lifetimeMins, $lifetimeMins); //https://laravel.com/docs/6.x/requests#cookies
            config(['session.lifetime' => $lifetimeMins]);
        }
        return $next($request);
    }

}
  1. Kernel ändern: app/Http/Kernel.php

Hinzufügen \App\Http\Middleware\SetSessionLength::class, kurz bevor \Illuminate\Session\Middleware\StartSession::class,.

  1. Ändern Sie die Konfiguration: config/session.php

'lifetime' => env('SESSION_LIFETIME', \App\Http\Middleware\SetSessionLength::SESSION_LIFETIME_DEFAULT_MINS),

  1. Ändern: resources/views/auth/login.blade.php

Damit der Benutzer seine bevorzugte Anzahl von Minuten auswählen kann, fügen Sie ein Dropdown-Menü mit Minuten hinzu, z. B. beginnend mit <select name="{{\App\Http\Middleware\SetSessionLength::SESSION_LIFETIME_PARAM}}">. Ansonsten wechseln SetSessionLength.php oben nicht zu ziehen $request->input sondern von woanders abrufen, z. B. einem Datenbankeintrag für diesen Benutzer.

  • Danke dafür, funktioniert wirklich gut. Funktioniert auch mit Laravel 5.5.

    – Jon Winstanley

    15. Februar 2020 um 2:17 Uhr

  • Es scheint nicht zu funktionieren, wenn der Sitzungstreiber vorhanden ist file. In Funktion createNativeDriver der Kernklasse Illuminate\Session\SessionManageres sendet die konfigurierte Lebensdauer von config as $lifetime Variable. Ein wichtiger Punkt ist, dass Managerregistrierungen immer im ersten Moment des Prozesses ausgeführt werden, sodass das Überschreiben der Konfiguration danach keinen Sinn macht. Die Version, die ich verwende, ist 6.0.

    – Thanh Dao

    24. März 2021 um 4:50 Uhr


Benutzer-Avatar
Piotr

Das Problem tritt auf, weil die Sitzung bereits gestartet wurde und Sie danach die Konfigurationsvariable für die Sitzungslebensdauer ändern.

Die Variable muss für die aktuelle Anfrage geändert werden, aber der Benutzer hat bereits eine Sitzung mit angegebener Lebensdauer.

Sie müssen Ihre Anmeldemethode ändern. Und führen Sie folgende Schritte aus:

  1. Prüfen Sie, ob der Benutzer in der Datenbank vorhanden ist
  2. Wenn ja, und er ein Benutzer ist, der eine längere Sitzungslebensdauer benötigt, führen Sie ihn aus config(['session.lifetime' => 1440]);
  3. Benutzer anmelden

Ich empfehle die Verwendung von Helper, um die Konfiguration im laufenden Betrieb zu ändern.

config(['session.lifetime' => 1440]);

  • Ich habe versucht, was Sie hier vorgeschlagen haben. ich setze config(['session.lifetime' => 1440]); vor dem Anruf Auth::attempt() Dennoch spiegelt es die Sitzungszeit nur 5 Minuten für alle Benutzer wider.

    – Jay Pandy

    15. November 2017 um 10:59 Uhr

  • Wo nehmen Sie Änderungen vor?

    – piotr

    15. November 2017 um 11:05 Uhr

  • In der Anmeldeaktion meines Controllers. Vor dem Anruf Auth::attempt Methode.

    – Jay Pandy

    15. November 2017 um 11:07 Uhr


  • Laravel-Version? Code-Auszug?

    – piotr

    15. November 2017 um 23:23 Uhr

  • Meine App ist in Laravel 5.2 if($oUser->user_type == SPECIAL) { config(['session.lifetime' => 1440]); } if (Auth::attempt(['email' => trim($oRequest->email), 'password' => $sPassword])) { return redirect('/'); }

    – Jay Pandy

    16. November 2017 um 5:47 Uhr


1014940cookie-checkLaravel hat session.lifetime auf Benutzerebene angepasst

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy