用户login后,Laravel 5会话不会持续
我在Laravel 5上遇到一个有趣的问题。
login用户后,login状态不会在页面间持续存在。 显然它与Session::
。
我login用户的方式非常简单:
if (Auth::attempt(['email' => $data['email'], 'password' => $data['password']], isset($data['remember_me']) ? TRUE : FALSE)) { return redirect()->intended('/'); }
一个简单的print_r(Session::all());
如果用户未login,则向我提供以下信息:
Array ( [_token] => wV8o75lZnCZ0f6CMMQgdBBM2AxSYjtWisAXx6TgZ [flash] => Array ( [old] => Array ( ) [new] => Array ( ) ) [_previous] => Array ( [url] => http://localhost/public ) )
用户login后redirect到/
数组看起来像这样:
Array ( [_token] => wV8o75lZnCZ0f6CMMQgdBBM2AxSYjtWisAXx6TgZ [flash] => Array ( [old] => Array ( ) [new] => Array ( ) ) [_previous] => Array ( [url] => http://localhost/public/ ) [login_82e5d2c56bdd0811318f0cf078b78bfc] => 2 )
但是,任何会导致页面刷新或redirect的操作之后,会话状态都将丢失。
我的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::
没有完全重置,我怀疑我没有正确login用户或只是做一些我不应该做的地方。
我遇到了类似的问题
Session::save();
在任何添加/更新/删除到会话存储之后。 所以它看起来像:
$id = Input::get('id'); Session::forget('cart.' .$id); Session::save();
我遇到过同样的问题。 一旦我删除了用于testing目的的转储响应的dd()和print_r()的各种组合,并允许方法完成并完全呈现视图,问题就消失了,会话持续存在。
我解决了变化
'cookie' => 'laravel_session',
至
'cookie' => 'myapp_session',
根据laravel,曲奇的名字会影响到每个车手
我不熟悉Laravel,但是在CodeIgniter中,我将用户会话保存在CI的Session类中,而Laravel也有一个。
我build议使用比默认$ _SESSION更持久的内置会话 – 可能会将用户数据保存在数据库中,并在每个页面刷新/更改会话从数据库再次填充。
当用户进行身份validation时,只需保存其会话数据,如下所示:
Session::put('userData', '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';
编辑:我看到你使用的authentication类。 我的答案主要是手动login的用户,它的工作原理。
我认为Auth Class应该默认这样做,但是可能你错过了一些configuration或者有一个bug。
这里有一个可能的解决scheme(Laravel 4,但值得一试): http ://laravel.io/forum/11-11-2014-authcheck-always-returning-false
更新:
因此,您应该尝试从中更改驱动程序值
'driver' => env('SESSION_DRIVER', 'file')
至
'driver' => 'file'
还有关于Laravel的文档,你可以看到,司机必须这样定义。
correctedHum …确保您的机器设置了良好的date和时间 ,以及networking上与其一起工作的其他机器。
以Debian系统为例:
在命令提示符中,命中date
( 您将看到date ),如果不正确,请按照以下说明操作:
- apt-get install ntp
- 服务ntp开始
- date(通常date和小时被更正)
首先,确保在filter,中间件或路由组之前没有某种types的内容导致它们被注销。 至less暂时,search任何Auth :: logout()并将其注释掉。 我已经看到这是不止一次的问题。
其次,你看起来像你正在做这个电话。 第三个参数是$ login:bool,默认为true。 这不是你的问题,但请将你的TRUE和FALSE改为true和false,以符合PSR-1/2标准。
我会build议你尝试另一个驱动程序,但是你已经完成了这个,并得到了相同的结果。 这导致我认为你有一些早期的代码误导到一个注销()。
如果你正在使用默认的laravel的文件会话 ,你可以检查你是否在session.php文件中使用,你需要确保2件事情。
- 会话目录即storage / framework / session /是可写的。
- login的path可能(/login)和检查身份validation(可能/仪表板)都在组web内
即。
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中适用于我。
使用“cookie”驱动程序而不是session.php(config \ session.php \ driver)的“文件”。 我使用“Auth :: loginUsingId()”api而不是“Auth :: attempt()”apilogin时遇到了问题,它破坏了另一个请求的会话。
确保目标路由也使用中间件StartSession。 在Laravel 5.2的“新鲜”安装中,“web”中间件组使用它,但是根path(/),也就是login后默认的$ 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文件中的域设置。 我写了一个不同的域,而不是我正在使用的那个域,自然不起作用。 虽然我不明白为什么框架继续前进,每次重新加载页面时创build会话文件。
我有同样的问题,但现在已经修复。
这是因为您的计算机和本地主机域中的会话之间发生冲突。 要解决这个问题:
首先检查你的config/session.php
文件并检查:
'domain' => null,
之后清除你的cookies:
在Firefox上右击 – >查看页面信息 – >安全 – >查看Cookies – >全部删除
我在laravel5.4中遇到了同样的问题,对我来说,解决scheme是:
在文件/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()
方法,你应该把'remember'标志设置为true。
所以,而不是做:
loginUsingId(1);
你应该做
loginUsingId(1, true);
看文档