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