wake-up-neo.com

Die Laravel 5-Sitzung bleibt nicht bestehen, nachdem der Benutzer angemeldet ist

Ich habe ein interessantes Problem mit Laravel 5.

Nachdem Sie sich bei einem Benutzer angemeldet haben, wird der angemeldete Status nicht seitenübergreifend beibehalten. Es hat eindeutig etwas mit Session:: zu tun.

Die Art und Weise, wie ich mich bei einem Benutzer anmelde, ist ziemlich einfach:

if (Auth::attempt(['email' => $data['email'], 'password' => $data['password']],
    isset($data['remember_me']) ? TRUE : FALSE))
{
    return redirect()->intended('/');
}

Ein einfaches print_r(Session::all()); gibt mir Folgendes, wenn der Benutzer NICHT angemeldet ist:

Array
(
    [_token] => wV8o75lZnCZ0f6CMMQgdBBM2AxSYjtWisAXx6TgZ
    [flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                )

        )

    [_previous] => Array
        (
            [url] => http://localhost/public
        )

)

Nachdem der Benutzer angemeldet und an / umgeleitet wurde, sieht das Array folgendermaßen aus:

Array
(
    [_token] => wV8o75lZnCZ0f6CMMQgdBBM2AxSYjtWisAXx6TgZ
    [flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                )

        )

    [_previous] => Array
        (
            [url] => http://localhost/public/
        )

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 2
)

Nach jeder Aktion, die zu einer Seitenaktualisierung oder einer Umleitung führt, geht der Sitzungsstatus jedoch verloren.

Meine config/session.php-Datei sieht so aus:

<?php

return [
    'driver' => env('SESSION_DRIVER', 'file'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,

];

Die lokal gespeicherte Datei für die Sitzung kann geschrieben und gelesen werden.

Ich habe versucht, database Laufwerk statt Datei zu verwenden. Dasselbe passiert, wenn der [login_xx] => 2-Schlüssel/Wert verloren geht und ich abgemeldet bin.

Da der Session:: nicht vollständig zurückgesetzt wird, vermute ich, dass ich den Benutzer nicht ordnungsgemäß anmelde oder einfach etwas mache, das ich nicht irgendwo tun sollte.

60
Andrei

Ich hatte ein ähnliches Problem und rief einfach an: 

Session::save();

nach dem Hinzufügen/Aktualisieren/Löschen zum Sitzungsspeicher. So sah es aus:

$id = Input::get('id');
Session::forget('cart.' .$id);
Session::save();
12
Kalpesh Panchal

Ich hatte das gleiche Problem. Nachdem ich die verschiedenen Kombinationen von dd () und print_r () entfernt hatte, um Antworten zu Testzwecken auszugeben und die Methode die Ansicht komplettieren und vollständig rendern ließ, ging das Problem weg und die Sitzungen blieben bestehen. 

8
spedley

Ich habe das Ändern gelöst

'cookie' => 'laravel_session',

zu

'cookie' => 'myapp_session',

laut laravel beeinflusst der name des kekses jeden fahrer

4

Ich bin nicht mit Laravel vertraut, aber auf CodeIgniter speichere ich Benutzersitzung in der Session-Klasse von CI, und Laravel hat auch eine.

Ich schlage vor, die build-in-Sitzung zu verwenden die persistenter ist als die Standardeinstellung $ _SESSION. Wahrscheinlich werden Benutzerdaten in der Datenbank gespeichert. Bei jeder Seitenaktualisierung änderung wird die Sitzung erneut aus der Datenbank gefüllt.

Wenn der Benutzer sich authentifiziert, speichern Sie einfach die Sitzungsdaten wie folgt:

Session::put('userData', 'value');

... wobei value nur ein boolescher Wert oder ein gesamtes Objekt sein kann, das benutzerspezifische Daten enthält.

Rufen Sie bei jedem Laden der Seite die Benutzerdaten aus der Sitzung ab:

$user = Session::get('userData');

if($user->id) echo 'user is logged-in'; //or if($user) - depends on what you store in 'userData' key
else echo 'guest only privilegies';

EDIT: Ich sehe, dass Sie die Auth-Klasse verwenden. Meine Antwort ist hauptsächlich für das manuelle Einloggen des Benutzers und es funktioniert.
Ich denke, dass die Auth-Klasse dies standardmäßig tun sollte, aber wahrscheinlich fehlt Ihnen eine Konfiguration oder es liegt ein Fehler vor. 

Hier ist eine mögliche Lösung (Laravel 4, aber es lohnt sich):/- http://laravel.io/forum/11-11-2014-authcheck-always-returning-false

Aktualisieren:

Ab this sollten Sie versuchen, den Treiberwert von zu ändern

'driver' => env('SESSION_DRIVER', 'file')

zu

'driver' => 'file'

... auch in den Dokumenten von Laravel kann man sehen, dass der Treiber so definiert werden muss.

1
tbutcaru

Sie müssen zwei Dinge überprüfen, wenn Sie die Datei-Sitzung der Standard-Laravel verwenden , die Sie überprüfen können, ob Sie die Datei session.php verwenden.

  1. Das Sitzungsverzeichnis, dh storage/framework/session /, ist schreibbar.
  2. Die Routen für die Anmeldung (/ login) und für die Überprüfung der Authentifizierung (evtl./Dashboard) liegen alle im Web der Gruppe

dh. 

Route::group(['middleware' => ['web']], function () {
   Route::get('/home/login', ['as' => 'login', 'uses' => '[email protected]']);
Route::post('/home/login', ['as' => 'login', 'uses' => '[email protected]']);
   Route::get('/home/dashboard', ['as' => 'home', 'uses' => '[email protected]']);
}

Das hat für mich in Laravel 5 funktioniert.

1

Stellen Sie zunächst sicher, dass Sie keine Vorfilter-, Middleware- oder Routengruppe haben, die dazu führt, dass sie abgemeldet werden. Suchen Sie zumindest vorübergehend nach Auth :: logout () und kommentieren Sie es aus. Ich habe gesehen, dass dies das Problem mehr als einmal war.

Zweitens: Sie sehen so aus, als würden Sie diesen Anruf korrekt durchführen. Der dritte Parameter ist $ login: bool und der Standardwert ist true. Dies ist nicht Ihr Problem, aber ändern Sie TRUE und FALSE in true und false, um die PSR-1/2-Standards zu erfüllen. 

Ich hätte empfohlen, dass Sie einen anderen Treiber ausprobieren, aber Sie haben das getan und haben das gleiche Ergebnis. Dies führt mich zu der Annahme, dass Sie über einen früheren Code verfügen, der zu einem logout () fehlgeleitet wird. 

1
Rob_vH

In meinem Fall musste ich die Domäneneinstellung in der Datei app/config/sessions.php ändern. Ich hatte dort eine andere Domain geschrieben als die, die ich verwendete, und natürlich funktionierte es nicht. Ich verstehe jedoch nicht, warum das Framework jedes Mal neu erstellt wurde, wenn ich die Seite neu lade.

0

correctHum ... Stellen Sie sicher, dass Ihre Maschine mit good date und hour eingestellt ist, und mit den anderen Computern im Netzwerk, die mit arbeiten.

Zum Beispiel im Debian-System:

In der Eingabeaufforderung drücken Sie date (Sie sehen das Datum). Wenn dies nicht der Fall ist, folgen Sie diesen Anweisungen:

  1. apt-get install ntp
  2. service ntp start
  3. datum (normalerweise werden Datum und Stunde korrigiert)
0
ShuifuraX

Ich hatte ein ähnliches Problem und habe es behoben, indem ich den Sitzungstreiber von SESSION_DRIVER=database In SESSION_DRIVER=file geändert habe.

0
Juancho Ramone

Wenn Sie die loginUsingId()-Methode verwenden, sollten Sie das Flag "remember" auf true setzen.

Also statt zu tun:

loginUsingId(1);

Du solltest tun

loginUsingId(1, true);

Siehe Dokumente

0
Abhishek

Verwenden Sie "Cookie" -Treiber anstelle von "Datei" von session.php (config\session.php\driver). Ich hatte ein Problem mit der Anmeldung mit "Auth :: loginUsingId ()" api anstelle von "Auth :: try ()" api. Die Sitzung wurde für eine andere Anforderung zerstört.

0
namal

ich hatte das gleiche Problem in Laravel 5.4, die Lösung für mich war:

In der Datei /app/Http/Kernel.php wurde standardmäßig AuthenticationSession der Middleware kommentiert.

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        //\Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

Nur unkommentiert funktionieren diese Linie und die Sitzung auf allen Routen

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];
0
rolodef

Stellen Sie sicher, dass die Zielroute auch die Middleware StartSession verwendet. In meiner "frischen" Installation von Laravel 5.2 wird sie von der "Web" Middleware-Gruppe verwendet, aber der Root-Pfad (/), der zufällig auch der Standardwert $ redirectTo nach dem Anmelden ist, war außerhalb davon. Riesiger Zeitverlust.

0
iipavlov

Ich hatte das gleiche Problem, aber es wurde jetzt behoben.

Dies liegt an dem Konflikt zwischen Sitzungen auf Ihrem Computer und in Ihrer localhost-Domäne. Um das Problem zu lösen:

Überprüfen Sie zunächst Ihre config/session.php-Datei und überprüfen Sie Folgendes:

'domain' => null,

danach löschen Sie Ihre Cookies:

klicken Sie unter Firefox mit der rechten Maustaste auf -> Seiteninfo anzeigen -> Sicherheit -> Cookies anzeigen -> Alle entfernen

0
Kamran

Ich hatte dieses Problem und ich löse diesen Weg. Nach Auth::attemp oder Auth::login() verwende echo, var_dump or dd() nicht.

Und jetzt funktioniert es

                public function testLogin(Request $request, $id){

                    $user = Account::find($id);
                    Auth::login($user);

                }
0
roll