用户登录后,Laravel 5会话无法保持

时间:2015-06-11 00:07:49

标签: php session laravel

我在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::没有完全重置,我怀疑我没有正确登录用户或只是做一些我不应该做的事情。

20 个答案:

答案 0 :(得分:12)

我遇到了类似的问题,我只是打电话:

Session::save();
在对Session存储进行任何添加/更新/删除之后

。所以它看起来像:

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

答案 1 :(得分:8)

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

答案 2 :(得分:5)

我解决了改变

'cookie' => 'laravel_session',

'cookie' => 'myapp_session',

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

答案 3 :(得分:1)

在用户登录会话不持久后,我遇到了同样的问题。 所以我找到了解决方案。 只需更改 config/session.php 文件中的一行

更改此代码

'cookie' => env( 'SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session' )

致:

'cookie' => env(
    'local_cookies',
    Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),

然后清除缓存。它将解决问题:)

答案 4 :(得分:1)

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

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

我会建议您尝试其他驱动程序,但是您已经完成了并且具有相同的结果。这让我觉得你有一些错误指向logout()的早期代码。

答案 5 :(得分:1)

如果您使用默认laravel的文件会话,则需要确定2件事情,您可以检查是否在session.php文件中使用。

  1. 会话目录,即存储/框架/会话/是可写的。
  2. 登录可能(/ login)和检查身份验证的路由(可能是/ dashboard)都在网络组中
  3. 即。

    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中对我有用。

答案 6 :(得分:1)

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

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

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

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

修改 我看到你使用Auth Class。我的答案主要是手动登录用户,它的工作原理 我认为默认情况下Auth Class应该这样做,但可能你错过了一些配置或者有一个bug。

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

更新

this开始,你应该尝试从

更改驱动程序值
'driver' => env('SESSION_DRIVER', 'file')

'driver' => 'file'

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

答案 7 :(得分:0)

我遇到了类似的问题,我通过更改会话驱动程序修复了它 iOSSESSION_DRIVER=database

答案 8 :(得分:0)

只需检查,然后cookie允许为假

'secure' => env('SESSION_SECURE_COOKIE', false)

在我的情况下,我将其设置为true,然后将其更改为 错误

答案 9 :(得分:0)

别忘了像session()->save()Session::save()那样保存

答案 10 :(得分:0)

只需在kernel.php文件中添加会话启动并向全局中间件认证中间件

答案 11 :(得分:0)

您可能想检查 public / index.php ,看看在Laravel代码之前是否还有代码。删除这些代码后,我可以正常登录。

<?php
    echo 'hello';
?>

<?php

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

我看来,有人“迷住”了我的网站,而index.php是恶意代码的主要目标

答案 12 :(得分:0)

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

所以,而不是做:

loginUsingId(1);

你应该做

loginUsingId(1, true);

See docs

答案 13 :(得分: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',
    ],
];

答案 14 :(得分:0)

我遇到了同样的问题,但现在已经解决了。

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

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

'domain' => null,

之后清除你的cookies:

在Firefox上

,右键单击 - &gt;查看页面信息 - &gt;安全 - &gt;查看Cookie - &gt;全部删除

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

现在正在运作

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

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

                }

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

correctHum ...确保您的计算机设置为良好的日期和时间,以及网络中使用的其他计算机。

例如在Debian系统中:

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

  1. apt-get install ntp
  2. service ntp start
  3. 日期(通常会更正日期和小时)