Сессия Laravel 5 не сохраняется после входа пользователя

52

У меня есть интересная проблема с 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:: не полностью reset, я подозреваю, что я не правильно вхожу в систему пользователя или просто делаю то, что я не должен делать где-то.

  • 0
    А Auth::check() после перенаправления возвращает false ?
  • 0
    Извините за поздний ответ, после первоначального перенаправления в / он возвращает true. После любого действия он вернет false , да.
Показать ещё 23 комментария
Теги:
session

15 ответов

12

Я столкнулся с подобной проблемой, я просто позвонил:

Session::save();

после добавления/обновления/удаления в хранилище сеансов. Это выглядело так:

$id = Input::get('id');
Session::forget('cart.' .$id);
Session::save();
  • 1
    Это исправило проблему для меня под Laravel 5.3. Перед добавлением save никакие пользовательские данные сеанса не сохраняются в файл, после этого все просто отлично. Однако я просто не понимаю: Session::save полностью пропущен в документе , без которого сеанс просто невозможно использовать, зачем команде laravel делать это?
  • 1
    Это окончательно решило мою проблему. Session :: сохранить (); Необходимо.
Показать ещё 1 комментарий
5

У меня была такая же проблема. Как только я удалил различные комбинации dd() и print_r(), которые я использовал, чтобы сбрасывать ответы для целей тестирования и позволял методу завершить и полностью отобразить представление, проблема исчезла, а сеансы продолжились.

  • 0
    Это сработало для меня (используя Laravel 5.1). Однако использование параметра return в print_r() позволяет сохранить сессию: print_r($request->session(), true);
  • 1
    Это правильно. Сеансы сохраняются в конце жизненного цикла запроса. Таким образом, прерывание выполнения предотвратит сохранение сеанса. Используйте dump () вместо dd () или запустите сохранение вручную с помощью Session :: save ()
Показать ещё 2 комментария
4

Я решил изменить

'cookie' => 'laravel_session',

к

'cookie' => 'myapp_session',

в соответствии с laravel имя файла cookie влияет на каждый драйвер

  • 0
    верно!!! работать на меня
  • 0
    Я также столкнулся с подобной проблемой и решил вышеуказанный ответ. проверьте здесь stackoverflow.com/questions/46216511/…
1

Вам нужно убедиться в двух вещах, если вы используете стандартный laravel файл сеанса, который вы можете проверить, используете ли вы файл session.php.

  • Каталог сеанса, т.е. storage/framework/session/, доступен для записи.
  • Маршруты для входа в систему, возможно (/login) и для проверки подлинности (возможно/dashboard), находятся внутри веб-группы

т.

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.

1

Во-первых, убедитесь, что у вас нет какого-либо файла перед фильтром, промежуточным программным обеспечением или группой маршрутов, из-за чего они выходят из системы. По крайней мере временно, найдите любой Auth:: logout() и прокомментируйте это. Я видел эту проблему не один раз.

Во-вторых, похоже, что вы правильно выполняете этот вызов. Третий параметр - $login: bool, и по умолчанию он равен true. Это не ваша проблема, но, пожалуйста, измените TRUE и FALSE на true и false, чтобы соответствовать стандартам PSR-1/2.

Я бы посоветовал вам попробовать другой драйвер, но вы сделали это и получили тот же результат. Это заставляет меня думать, что у вас есть какой-то более ранний код, который неправильно направляется на logout().

1

correctedHum... Убедитесь, что ваш компьютер настроен с хорошей датой и часом, а также другими машинами в сети, которые работают с.

Например, в системе Debian:

В командной строке нажмите date (вы увидите дату), если это не правильно, выполните следующие инструкции:

  • apt-get install ntp
  • сервис ntp start
  • дата (обычно дата и час корректируются)
1

Я не знаком с Laravel, но на CodeIgniter я сохраняю сессию пользователя в классе сеансов CI, и у Laravel тоже есть.

Я предлагаю использовать сессию которая более устойчива, чем по умолчанию $_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';

EDIT: Я вижу, что вы используете Auth Class. Мой ответ в основном предназначен для ручного входа пользователя, и он работает.
Я думаю, что Auth Class должен делать это по умолчанию, но, вероятно, вам не хватает какой-либо конфигурации или есть ошибка.

Здесь возможно решение (Laravel 4, но стоит попробовать): http://laravel.io/forum/11-11-2014-authcheck-always-returning-false

Обновление:

По этому вы должны попытаться изменить значение драйвера с

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

к

'driver' => 'file'

... также в документах Laravel вы можете видеть, что драйвер должен быть определен таким образом.

  • 0
    К сожалению, эта ссылка фиолетовая :(. Я загадала все, что могла придумать за последние 2 дня.
  • 0
    Просто сделайте несколько put и get внутри Session Class и посмотрите, сохранятся ли данные после обновления / изменения страницы. Если данные не потеряны, то это проблема с классом аутентификации или чем-то еще, что вы делаете в своем приложении.
Показать ещё 5 комментариев
0

Если вы используете метод loginUsingId(), вы должны установить флаг "запомнить" в true.

Итак, вместо выполнения:

loginUsingId(1);

Вы должны сделать

loginUsingId(1, true);

См. документы

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

У меня была такая же проблема, но теперь она исправлена.

Это из-за конфликта между сеансами на вашем компьютере и в вашем домене localhost. Чтобы решить проблему:

Прежде всего проверьте файл config/session.php и проверьте это:

'domain' => null,

после этого очистите файлы cookie:

в Firefox, щелкните правой кнопкой мыши → просмотреть информацию о странице → Безопасность → Просмотр файлов cookie → Удалить все

0

В моем случае мне пришлось изменить настройку домена в файле app/config/sessions.php. У меня был другой домен, написанный там, а не тот, который я использовал, и, естественно, это не сработало. Хотя я не понимаю, почему каркас пошел вперед и создал файлы сеансов каждый раз, когда я перезагружал страницу.

0

У меня была аналогичная проблема, и я исправил ее, изменив драйвер сеанса из SESSION_DRIVER=database в SESSION_DRIVER=file

0

У меня была эта проблема, и я решаю этот путь. После Auth::attemp или Auth::login() не используйте echo, var_dump or dd(), я не знаю, почему, но это предотвращает сохранение сеанса в браузере.

И теперь работает

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

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

                }
0

Убедитесь, что целевой маршрут также использует промежуточное ПО StartSession. В моей "свежей" установке Laravel 5.2 группа промежуточного программного обеспечения "web" использует ее, но корневой путь (/), который также является $redirectTo по умолчанию после входа в систему, находился за его пределами. Огромная потеря времени.

0

Используйте "cookie" вместо "файла" session.php(config\session.php\driver). У меня возникла проблема с логином, используя "Auth:: loginUsingId()" api вместо "Auth:: попытка()" api, он уничтожил сеанс для другого запроса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню