У меня есть интересная проблема с 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, я подозреваю, что я не правильно вхожу в систему пользователя или просто делаю то, что я не должен делать где-то.
Я столкнулся с подобной проблемой, я просто позвонил:
Session::save();
после добавления/обновления/удаления в хранилище сеансов. Это выглядело так:
$id = Input::get('id');
Session::forget('cart.' .$id);
Session::save();
save
никакие пользовательские данные сеанса не сохраняются в файл, после этого все просто отлично. Однако я просто не понимаю: Session::save
полностью пропущен в документе , без которого сеанс просто невозможно использовать, зачем команде laravel делать это?
У меня была такая же проблема. Как только я удалил различные комбинации dd() и print_r(), которые я использовал, чтобы сбрасывать ответы для целей тестирования и позволял методу завершить и полностью отобразить представление, проблема исчезла, а сеансы продолжились.
print_r()
позволяет сохранить сессию: print_r($request->session(), true);
Я решил изменить
'cookie' => 'laravel_session',
к
'cookie' => 'myapp_session',
в соответствии с laravel имя файла cookie влияет на каждый драйвер
Вам нужно убедиться в двух вещах, если вы используете стандартный laravel файл сеанса, который вы можете проверить, используете ли вы файл session.php.
т.
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.
Во-первых, убедитесь, что у вас нет какого-либо файла перед фильтром, промежуточным программным обеспечением или группой маршрутов, из-за чего они выходят из системы. По крайней мере временно, найдите любой Auth:: logout() и прокомментируйте это. Я видел эту проблему не один раз.
Во-вторых, похоже, что вы правильно выполняете этот вызов. Третий параметр - $login: bool, и по умолчанию он равен true. Это не ваша проблема, но, пожалуйста, измените TRUE и FALSE на true и false, чтобы соответствовать стандартам PSR-1/2.
Я бы посоветовал вам попробовать другой драйвер, но вы сделали это и получили тот же результат. Это заставляет меня думать, что у вас есть какой-то более ранний код, который неправильно направляется на logout().
correctedHum... Убедитесь, что ваш компьютер настроен с хорошей датой и часом, а также другими машинами в сети, которые работают с.
Например, в системе Debian:
В командной строке нажмите date
(вы увидите дату), если это не правильно, выполните следующие инструкции:
Я не знаком с 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 вы можете видеть, что драйвер должен быть определен таким образом.
put
и get
внутри Session Class и посмотрите, сохранятся ли данные после обновления / изменения страницы. Если данные не потеряны, то это проблема с классом аутентификации или чем-то еще, что вы делаете в своем приложении.
Если вы используете метод loginUsingId()
, вы должны установить флаг "запомнить" в true.
Итак, вместо выполнения:
loginUsingId(1);
Вы должны сделать
loginUsingId(1, true);
У меня была та же проблема в 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',
],
];
У меня была такая же проблема, но теперь она исправлена.
Это из-за конфликта между сеансами на вашем компьютере и в вашем домене localhost. Чтобы решить проблему:
Прежде всего проверьте файл config/session.php
и проверьте это:
'domain' => null,
после этого очистите файлы cookie:
в Firefox, щелкните правой кнопкой мыши → просмотреть информацию о странице → Безопасность → Просмотр файлов cookie → Удалить все
В моем случае мне пришлось изменить настройку домена в файле app/config/sessions.php. У меня был другой домен, написанный там, а не тот, который я использовал, и, естественно, это не сработало. Хотя я не понимаю, почему каркас пошел вперед и создал файлы сеансов каждый раз, когда я перезагружал страницу.
У меня была аналогичная проблема, и я исправил ее, изменив драйвер сеанса из
SESSION_DRIVER=database
в
SESSION_DRIVER=file
У меня была эта проблема, и я решаю этот путь.
После Auth::attemp
или Auth::login()
не используйте echo, var_dump or dd()
, я не знаю, почему, но это предотвращает сохранение сеанса в браузере.
И теперь работает
public function testLogin(Request $request, $id){
$user = Account::find($id);
Auth::login($user);
}
Убедитесь, что целевой маршрут также использует промежуточное ПО StartSession. В моей "свежей" установке Laravel 5.2 группа промежуточного программного обеспечения "web" использует ее, но корневой путь (/), который также является $redirectTo по умолчанию после входа в систему, находился за его пределами. Огромная потеря времени.
Используйте "cookie" вместо "файла" session.php(config\session.php\driver). У меня возникла проблема с логином, используя "Auth:: loginUsingId()" api вместо "Auth:: попытка()" api, он уничтожил сеанс для другого запроса.
Auth::check()
после перенаправления возвращаетfalse
?/
он возвращает true. После любого действия он вернетfalse
, да.