用户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 ),如果不正确,请按照以下说明操作:

  1. apt-get install ntp
  2. 服务ntp开始
  3. date(通常date和小时被更正)

首先,确保在filter,中间件或路由组之前没有某种types的内容导致它们被注销。 至less暂时,search任何Auth :: logout()并将其注释掉。 我已经看到这是不止一次的问题。

其次,你看起来像你正在做这个电话。 第三个参数是$ login:bool,默认为true。 这不是你的问题,但请将你的TRUE和FALSE改为true和false,以符合PSR-1/2标准。

我会build议你尝试另一个驱动程序,但是你已经完成了这个,并得到了相同的结果。 这导致我认为你有一些早期的代码误导到一个注销()。

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

  1. 会话目录即storage / framework / session /是可写的。
  2. 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::attempAuth::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); 

看文档