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

And*_*rei 61 php session laravel

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

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

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

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

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

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

            [new] => Array
                (
                )

        )

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

)
Run Code Online (Sandbox Code Playgroud)

用户登录后重定向到/该阵列如下所示:

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

            [new] => Array
                (
                )

        )

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

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 2
)
Run Code Online (Sandbox Code Playgroud)

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

我的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,

];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Kal*_*hal 12

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

Session::save();
Run Code Online (Sandbox Code Playgroud)

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

$id = Input::get('id');
Session::forget('cart.' .$id);
Session::save();
Run Code Online (Sandbox Code Playgroud)


spe*_*ley 10

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


小智 7

我解决了变化

'cookie' => 'laravel_session',
Run Code Online (Sandbox Code Playgroud)

'cookie' => 'myapp_session',
Run Code Online (Sandbox Code Playgroud)

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


tbu*_*aru 2

我对 Laravel 不熟悉,但在 CodeIgniter 上,我将用户会话保存在 CI 的 Session 类中,Laravel 也有一个。

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

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

Session::put('userData', 'value');
Run Code Online (Sandbox Code Playgroud)

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

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

$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';
Run Code Online (Sandbox Code Playgroud)

编辑: 我看到您使用 Auth 类。我的答案主要是用户手动登录并且它有效。
我认为 Auth 类应该默认执行此操作,但可能您缺少一些配置或存在错误。

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

更新:

截至目前您应该尝试更改驱动程序值

'driver' => env('SESSION_DRIVER', 'file')
Run Code Online (Sandbox Code Playgroud)

'driver' => 'file'
Run Code Online (Sandbox Code Playgroud)

...还在 Laravel 的文档中您可以看到驱动程序必须这样定义。

  • @TanaseButcaru,您的最新更新是不正确的(或者说是不利的。它在技术上是有效的)并且定义驱动程序的方式是错误的。Laravel 5 使用 DotEnv 来配置设置。`env()` 函数将查看名为 `.env` 的文件以获取 `SESSION_DRIVER` 的定义并使用它。如果没有该定义,它将回退到第二个参数,在本例中为“file” (2认同)