首页 文章

用户登录后,Laravel 5会话不会持续存在

提问于
浏览
60

我对Laravel 5有一个有趣的问题 .

登录用户后,登录状态不会跨页面保留 . 显然它与 Session:: 有关 .

我登录用户的方式很简单:

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

如果用户未登录,则简单 print_r(Session::all()); 给出以下内容:

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

            [new] => Array
                (
                )

        )

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

)

用户登录后重定向到 / ,数组如下所示:

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

            [new] => Array
                (
                )

        )

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

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 2
)

但是,在任何导致页面刷新或重定向的操作之后,会话状态将丢失 .

我的 config/session.php 文件看起来像这样:

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

];

可以写入和读取本地存储的会话文件 .

我尝试使用 database 驱动器而不是文件 . 同样的事情发生 [login_xx] => 2 键/值丢失并且我已经注销了 .

由于 Session:: 没有完全重置,我没有正确登录用户或只是做一些我不应该做某事的事情 .

15 回答

  • 12

    我遇到过同样的问题 . 一旦我删除了dd()和print_r()的各种组合,我就会使用转储响应进行测试,并允许方法完成并完全呈现视图,问题就消失了,会话仍然存在 .

  • 0

    我解决了改变

    'cookie' => 'laravel_session',
    

    'cookie' => 'myapp_session',
    

    根据laravel,cookie的名称会影响每个驱动程序

  • 1

    我遇到了类似的问题,我简单地说:

    Session::save();
    

    在任何添加/更新/删除会话存储之后 . 所以它看起来像:

    $id = Input::get('id');
    Session::forget('cart.' .$id);
    Session::save();
    
  • 1

    我对Laravel并不熟悉,但在CodeIgniter上,我在CI的Session Class中保存了用户会话,Laravel也有 .

    我建议使用build-in session,它比默认的$ _SESSION更持久 - 可能它将用户数据保存在数据库中,并且在每个页面上刷新/更改会话再次从DB填充 .

    用户进行身份验证时,只需保存其会话数据,如下所示:

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

    ...其中value可以只是一个布尔值,也可以是保存用户特定数据的整个对象 .

    在每个页面加载时,从会话中获取用户数据:

    $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: 我看到你使用的是Auth Class . 我的答案主要是手动登录用户,它的工作原理 .
    我认为默认情况下Auth类应该这样做,但可能你是一个错误 .

    这是一个可能的解决方案(Laravel 4,但值得一试):http://laravel.io/forum/11-11-2014-authcheck-always-returning-false

    更新:

    this开始,您应该尝试更改驱动程序值

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

    'driver' => 'file'
    

    ...同样在Laravel的文档上你可以看到驱动程序必须这样定义 .

  • 1

    首先,确保您没有某种过滤器,中间件或路由组导致它们被注销 . 至少暂时,搜索任何Auth :: logout()并将其注释掉 . 我不止一次地看到这个问题 .

    其次,你看起来像是在正确地进行这个电话 . 第三个参数是$ login:bool,默认为true . 这不是您的问题,但请将您的TRUE和FALSE更改为true和false以符合PSR-1/2标准 .

    我会建议你尝试另一个驱动程序,但是你已经做到了并且有相同的结果 . 这让我觉得你有一些错误指向logout()的早期代码 .

  • 0

    如果你使用默认laravel的 file session ,你需要确定2件事,你可以检查你是否在session.php文件中使用 .

    • 会话目录即存储/框架/会话/是可写的 .

    • 登录可能(/ login)和检查身份验证(可能是/ dashboard)的路径都在组web中

    即 .

    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']);
    }
    

    这在Laravel 5中对我有用 .

  • 0

    correctHum ...确保您的机器设置为 good date and hour ,并且与网络上使用的其他机器一样 .

    例如在Debian系统中:

    在命令提示符下,按 date (您将看到日期),如果不正确,请按照以下说明操作:

    • apt-get install ntp

    • service ntp start

    • 日期(通常更正日期和小时)

  • 0

    使用“cookie”驱动程序而不是session.php(config \ session.php \ driver)的“file” . 我使用“Auth :: loginUsingId()”api而不是“Auth :: attempt()”api登录时遇到问题,它破坏了另一个请求的会话 .

  • 0

    确保目标路由也使用中间件StartSession . 在我的“新鲜”安装的Laravel 5.2中,“web”中间件组使用它,但根路径(/),也恰好是默认的$ redirectTo之后登录,在它之外 . 巨大的时间浪费 .

  • 0

    我有这个问题,我解决这个问题 . 在 Auth::attempAuth::login() 之后不要使用 echo, var_dump or dd() 我不知道为什么,但那些阻止在浏览器中保持会话 .

    现在正在努力

    public function testLogin(Request $request, $id){
    
                        $user = Account::find($id);
                        Auth::login($user);
    
                    }
    
  • 0

    我有类似的问题,我通过将会话驱动程序从 SESSION_DRIVER=database 更改为 SESSION_DRIVER=file 来修复它

  • 0

    在我的情况下,我不得不更改app / config / sessions.php文件中的域设置 . 我有一个不同的域写在那里而不是我正在使用的域,自然它没有用 . 虽然我不明白为什么框架继续进行并且每次重新加载页面时都会创建会话文件 .

  • 4

    我有同样的问题,但现在已经解决了 .

    这是因为您的计算机和localhost域中的会话之间存在冲突 . 解决问题:

    首先检查你的 config/session.php 文件并检查:

    'domain' => null,
    

    之后清除你的 Cookies :

    在Firefox上,右键单击 - >查看页面信息 - >安全性 - >查看Cookies - >全部删除

  • 0

    我在laravel 5.4中遇到了同样的问题,我的解决方案是:

    在文件/app/Http/Kernel.php中,默认情况下注释了中间件AuthenticateSession .

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

    只有取消注释此行,并且会话在所有路由中都能正常工作

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

    如果您使用 loginUsingId() 方法,则应将'remember'标志设置为true .

    所以,而不是做:

    loginUsingId(1);
    

    你应该做

    loginUsingId(1, true);
    

    See docs

相关问题