web-dev-qa-db-fra.com

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 la connexion d'un utilisateur, l'état de connexion n'est pas conservé d'une page à l'autre. Clairement, cela a quelque chose à voir avec Session::.

La façon dont je connecte un utilisateur est assez simple:

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

Une simple print_r(Session::all()); me donne les informations suivantes si l'utilisateur n'est pas connecté:

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

            [new] => Array
                (
                )

        )

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

)

Une fois que l'utilisateur est connecté et 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 toute action entraînant une actualisation de la page ou une redirection, l'état de la session est perdu.

Mon fichier config/session.php 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 le lecteur database à la place du fichier. La même chose se produit, la clé/valeur [login_xx] => 2 est perdue et je suis déconnecté.

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

60
Andrei

J'ai fait face à un problème similaire, j'ai simplement appelé: 

Session::save();

après tout ajout/mise à jour/suppression au stockage de session. Donc, il ressemblait à:

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

J'ai eu le même problème. Une fois que j'ai supprimé les diverses combinaisons de dd () et print_r () que j'utilisais pour dump des réponses à des fins de test et que la méthode était complète et restituée, le problème a été résolu et les sessions ont persisté. 

8
spedley

J'ai résolu de changer

'cookie' => 'laravel_session',

à

'cookie' => 'myapp_session',

selon laravel, le nom du cookie affecte tous les conducteurs

4
Ernesto Hernández

Je ne connais pas bien Laravel, mais sur CodeIgniter, j'enregistre une session d'utilisateur dans la classe de session de CI et Laravel en a une aussi.

Je suggère d'utiliser la session intégrée qui est plus persistante que $ _SESSION par défaut - elle enregistre probablement les données de l'utilisateur dans la base de données et, à chaque actualisation/modification de page, la session est remplie à nouveau à partir de la base de données.

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

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

... où valeur peut être simplement une valeur booléenne ou un objet entier contenant des données spécifiques à l'utilisateur.

À chaque chargement de page, obtenez les données 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 cela fonctionne.
Je pense que la classe Auth devrait le faire par défaut, mais il vous manque probablement une configuration ou un bogue. 

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

Mettre à jour:

À partir de this vous devriez essayer de changer la valeur du pilote de

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

à

'driver' => 'file'

... également sur la documentation de Laravel, vous pouvez voir que le pilote doit être défini comme ça.

1
tbutcaru

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

  1. Le répertoire de session, à savoir storage/framework/session/est accessible en écriture.
  2. Les routes permettant de se connecter (/ login) et de vérifier l’authentification (/ tableau de bord) se trouvent toutes dans le groupe Web.

c'est à dire. 

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
Yatin Mehandiratta

Tout d'abord, assurez-vous de ne pas avoir de filtre avant, de middleware ou de groupe de routage qui les a déconnectés. Au moins temporairement, recherchez Auth :: logout () et commentez-le. J'ai vu cela être le 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 sa valeur par défaut est true. Ce n'est pas votre problème, mais veuillez changer vos valeurs VRAI et FAUX en vraies et fausses pour respecter les normes PSR-1/2. 

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

1
Rob_vH

Dans mon cas, je devais changer le paramètre de domaine dans le fichier app/config/sessions.php. J'avais écrit un domaine différent à la place de celui que j'utilisais et, naturellement, cela n'a pas fonctionné. Bien que je ne comprenne pas pourquoi le framework a été créé et a créé les fichiers de session chaque fois que je rechargeais la page.

0
Florian Stancioiu

correctedHum ... Assurez-vous que votre machine est configurée avec bonne date et heure , ainsi que les autres machines du réseau qui travaillent avec.

Par exemple dans le système Debian:

Dans la commande Invite, appuyez sur date (vous verrez la date). Si ce n'est pas correct, suivez ces instructions:

  1. apt-get install ntp
  2. service ntp start
  3. date (normalement la date et l'heure sont corrigées)
0
ShuifuraX

J'ai eu un problème similaire et je l'ai résolu en changeant le pilote de session de SESSION_DRIVER=database À SESSION_DRIVER=file

0
Juancho Ramone

Si vous utilisez la méthode loginUsingId(), vous devez définir le drapeau 'Remember' sur true.

Donc, au lieu de faire:

loginUsingId(1);

Tu devrais faire

loginUsingId(1, true);

Voir docs

0
Abhishek

Utilisez le pilote "cookie" au lieu de "fichier" de session.php (config\session.php\driver). J'ai eu un problème avec la connexion en utilisant l'API "Auth :: loginUsingId ()" au lieu de l'API "Auth :: tentative ()", la session a été détruite pour une autre demande.

0
namal

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

Dans le fichier /app/Http/Kernel.php, le middleware commenté était 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',
    ],
];

Ne décommentez cette ligne et la session fonctionne correctement sur toutes les routes.

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

Assurez-vous que la route cible utilise également le middleware StartSession. Dans ma "nouvelle" installation de Laravel 5.2, le groupe de middleware "web" l'utilise, mais le chemin racine (/), qui se trouve être également la redirection par défaut $ $ après connexion, était en dehors de celui-ci. Énorme perte de temps.

0
iipavlov

J'ai eu le même problème, mais il a été corrigé maintenant.

Cela est dû au conflit entre les sessions de votre machine et de votre domaine localhost. Résoudre le problème:

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

'domain' => null,

après cela, effacez vos cookies:

sur Firefox, faites un clic droit -> afficher les informations sur la page -> Sécurité -> Afficher les cookies -> Supprimer tout

0
Kamran

J'ai eu ce problème et je résous de cette façon . Après Auth::attemp ou Auth::login(), n'utilisez pas echo, var_dump or dd(), je ne sais pas pourquoi, mais ils empêchent de conserver la session dans le navigateur.

Et maintenant travaille

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

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

                }
0
roll