La session Laravel 5 ne persiste pas après la connexion de l'utilisateur

J'ai un problème intéressant avec Laravel 5.

après l'ouverture de session dans un utilisateur, l'état d'ouverture de session n'est pas persisté à travers les pages. Il est clair que cela a quelque chose à voir avec Session:: .

La façon dont je suis l'ouverture d'un utilisateur est assez simple:

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

un simple print_r(Session::all()); me donne ce qui suit si l'utilisateur n'est pas connecté:

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

            [new] => Array
                (
                )

        )

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

)

Après que l'utilisateur est connecté dans un redirigé vers / le tableau ressemble à ceci:

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

            [new] => Array
                (
                )

        )

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

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 2
)

cependant, après n'importe quelle action qui conduira à une mise à jour de page ou une redirection, le statut de session est perdu.

Mon config/session.php fichier ressemble à ceci:

<?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,

];

le fichier stocké localement pour la session peut être écrit et lu.

j'ai essayé d'utiliser database drive au lieu de file. Même chose se produit le [login_xx] => 2 clé/valeur est perdue et je suis connecté.

comme le Session:: n'est pas complètement réinitialisé, je soupçonne que je ne me connecte pas correctement à l'utilisateur ou que je ne fais pas quelque chose que je ne devrais pas faire quelque part.

58
demandé sur Andrew 2015-06-11 03:07:48

15 réponses

j'ai fait face à la même question, j'ai simplement appelé:

Session::save();

après tout ajouter/mettre à jour/supprimer au stockage de Session. De sorte qu'il ressemblait à:

$id = Input::get('id');
Session::forget('cart.' .$id);
Session::save();
12
répondu Kalpesh Panchal 2015-07-10 20:00:24

j'ai eu le même problème. Une fois que j'ai enlevé les diverses combinaisons de dd() et print_r() que j'utilisais pour décharger les réponses à des fins de test et que j'ai permis à la méthode de compléter et de rendre complètement la vue, le problème a disparu et les sessions ont persisté.

8
répondu spedley 2015-08-04 12:30:32

j'ai résolu le changement

'cookie' => 'laravel_session',

à

'cookie' => 'myapp_session',

selon laravel le nom du cookie affecte chaque conducteur

4
répondu Ernesto Hernández 2016-09-05 17:14:11

Je ne suis pas familier avec Laravel, mais sur CodeIgniter je sauve la session utilisateur dans la classe de Session de CI et Laravel en a une aussi.

je suggère d'utiliser la session de build-in qui est plus persistante que $_SESSION par défaut - probablement il sauve des données d'utilisateur dans la base de données et sur chaque page rafraîchir/changer la session est peuplée de nouveau à partir de DB.

lorsque l'utilisateur s'authentifie, enregistrez simplement ses données de session comme ceci:

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

...où la valeur pourrait être juste une valeur booléenne ou un objet entier qui détient des données spécifiques de l'utilisateur.

sur chaque page de charge, Obtenir les données de l'utilisateur de la session:

$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: Je vois que vous utilisez la classe Auth. Ma réponse est principalement pour la connexion manuelle de l'utilisateur et il fonctionne.

Je pense que la classe Auth devrait faire cela par défaut, mais probablement vous manquez certains configuration ou il y a un bug.

Voici une solution possible (Laravel 4, mais il vaut la peine d'essayer): http://laravel.io/forum/11-11-2014-authcheck-always-returning-false

mise à jour:

à partir de ce vous devriez essayer de changer la valeur du pilote de

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

à

'driver' => 'file'

...aussi sur les docs de Laravel vous pouvez voir que le conducteur doit être défini comme ça.

1
répondu tbutcaru 2017-05-23 12:10:05

tout d'abord, assurez-vous que vous n'avez pas une sorte de filtre avant, middleware, ou un groupe de route qui provoque leur déconnexion. Au moins temporairement, recherchez N'importe quel Auth::logout() et commentez-le. J'ai vu ce problème plus d'une fois.

Deuxièmement, vous avez l'air de faire cet appel correctement. Le troisième paramètre est $login: bool et il est par défaut à true. Ce n'est pas votre problème, mais s'il vous plaît changer votre vrai et faux à vrai et faux pour répondre avec les normes PSR-1/2.

je vous aurais conseillé d'essayer un autre pilote, mais vous l'avez fait et vous avez le même résultat. Ceci m'amène à penser que vous avez une sorte de code antérieur qui est mal dirigé vers un logout().

1
répondu Rob_vH 2015-07-01 20:14:02

vous devez vous assurer de 2 choses si vous utilisez par défaut la de laravel" file session que vous pouvez vérifier si vous utilisez en session.fichier php.

  1. le répertoire de session, c'est-à-dire le stockage/le cadre/la session/ est accessible en écriture.
  2. les routes pour se connecter à maybe (/login) et pour vérifier l'authentification (maybe / dashboard) sont toutes dans le groupe web

ie.

Route::group(['middleware' => ['web']], function () {
   Route::get('/home/login', ['as' => 'login', 'uses' => 'HomeController@getLogin']);
Route::post('/home/login', ['as' => 'login', 'uses' => 'HomeController@postLogin']);
   Route::get('/home/dashboard', ['as' => 'home', 'uses' => 'HomeController@getDashboard']);
}

cela a fonctionné pour moi dans Laravel 5.

1
répondu Yatin Mehandiratta 2016-01-12 06:18:22

correctedHum... Assurez-vous que votre machine est équipée de bonne date et heure , et également les autres machines sur le réseau qui travaillent avec.

par exemple dans le système Debian:

dans l'invite de commande, appuyez sur date ( vous verrez la date ), si elle n'est pas correcte suivez ces instructions:

  1. apt-get install ntp
  2. service ntp start
  3. date (normalement la date et l'heure sont corrigées)
0
répondu ShuifuraX 2015-06-17 09:34:10

utilisez le pilote " cookie "au lieu de" file " de la session.php (config\session.PHP\driver). J'ai eu un problème avec login en utilisant "Auth::loginUsingId()" api au lieu de "Auth::attemp()" api, il a détruit la session pour une autre requête.

0
répondu namal 2015-09-01 07:19:22

assurez-vous que la route cible utilise également la Middleware StartSession. Dans mon installation" fresh "de Laravel 5.2, Le groupe middleware" web " l'utilise, mais le chemin racine ( / ), qui se trouve être aussi le $redirectTo par défaut après login, était en dehors de celui-ci. Perte de temps énorme.

0
répondu iipavlov 2016-03-04 16:12:40

j'ai eu ce problème et je le résoudre de cette façon. Après Auth::attemp ou Auth::login() dont utiliser echo, var_dump or dd() Je ne sais pas pourquoi, mais ceux-ci empêchent de garder la session dans le navigateur.

, Et qui maintenant travaille

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

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

                }
0
répondu roll 2016-08-18 01:48:36

j'ai eu un problème similaire et je l'ai corrigé en changeant le pilote de Session de SESSION_DRIVER=database de SESSION_DRIVER=file

0
répondu Juancho Ramone 2016-12-09 10:09:04

dans mon cas, j'ai dû changer le paramétrage du domaine dans l'application/config/sessions.fichier php. J'ai écrit un domaine différent au lieu de celui que j'utilisais et naturellement ça n'a pas marché. Bien que je ne comprenne pas pourquoi le framework est allé de l'avant et a créé les fichiers de session chaque fois que je rechargeais la page.

0
répondu Florian Stancioiu 2017-03-26 09:43:13

j'ai eu le même problème, mais il a été résolu maintenant.

c'est à cause du conflit entre les sessions dans votre machine et dans votre domaine localhost. Pour résoudre le problème:

tout d'abord, vérifiez votre fichier config/session.php et vérifiez ceci:

'domain' => null,

après cela, effacer vos cookies:

sur Firefox, clic droit -> afficher la page info -> Sécurité -> Afficher les Cookies -> Supprimer tous les

0
répondu Kamran 2017-04-11 16:02:34

j'ai eu le même problème dans laravel 5.4, la solution pour moi était:

dans le fichier /app/Http/Kernel.php, a été commenté middleware AuthenticateSession par défaut.

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',
    ],
];

seulement décommenté cette ligne et la session de travail amende dans tous les itinéraires

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
répondu rolodef 2017-05-01 03:36:52

si vous utilisez la méthode loginUsingId() , vous devez mettre le drapeau 'remember' à true.

ainsi, au lieu de faire:

loginUsingId(1);

, Vous devriez faire

loginUsingId(1, true);

voir docs

0
répondu Abhishek 2017-10-06 09:57:37