2016-03-10 95 views
1

我有我的身份验证登录时这样做。Auth不坚持在Laravel 5.2

if (Auth::attempt($userdata)) { 
    dd(Auth::user()); //this shows the user just fine, 
         //which proves that the auth driver is working. 
    return redirect()->intended('dashboard'); 
} 

但是,在重定向到仪表板之后。看起来auth不是持久的。如果我做dd(Auth::user())甚至只是Auth::check()它会返回null。

,路线如下:

Route::group(['middleware' => ['web']], function() { 
    Route::get('test',function(){ 
     dd(Auth::user()); //returns null 
     echo Auth::user()->name; // returns Trying to get property of non-object 
    }); 
}); 

我在做什么错?

关于这个奇怪的事情是,昨晚它工作。它有点神奇地停止工作。

+0

如果您在'attempt'之后'dd',则会话不一定会持续。如果你只是返回一个空字符串作为响应而不是你的重定向,并且手动进入测试路由,那么会发生什么? – Dencker

+0

另外,不是'attempt',你可以通过调用'login'来进一步调试,并强制登录一个用户。这至少会绕开实际授权的潜在问题。这很可能是cookie或会话问题:) – Dencker

回答

0

只需将“auth”中间件添加到“测试”路由中,并在登录时尝试访问它。它不应该以这种方式给您提供任何错误。如果您尝试在未登录的情况下访问它,它应该将您重定向到“auth”中间件中定义的任何路由。

通过使用“auth”中间件,您基本上确保Auth :: user()将始终返回适当的User实例。

现在,如果这种方法有效,那么您可以确定Laravel Auth确实是坚持用户,而问题在您的代码中的其他位置。

我没有注意到Laravel的Auth类有任何问题。

+0

Laravel 5.2使用网络中间件。不需要auth中间件。但是,如果我添加了Auth中间件,就像你说的那样。它只是将我重定向回登录页面。我觉得奇怪的是,Auth尝试似乎返回一个有效的登录名。它只是'忘记它'的重定向。因此,使用“网络”中间件,我只是在重定向上获得空白页面。通过auth中间件,我可以重定向到登录页面。 – KyleK

+0

Web中间件具有CSRF和XSS保护功能,它不会检查用户是否已登录。 只是想指出,您可以实际检查Auth是否正在执行将用户登录到通过保护通过“网络”中间件保护您的组内的一条路线,以确保Auth运行正常。如果是(不允许你访问,如果没有登录),那么你的问题是在你的代码中的其他地方:) –

+0

好的,但即使添加auth中间件后,我只是在登录时重定向,回到登录页面。即使Auth控制器中的dd(Auth :: user())显示登录用户?所以我说的是,登录似乎在为一个请求工作,但在重定向时,它不会持续,因此重定向回登录页面。试过会话驱动程序,数据库驱动程序,文件驱动程序的一切似乎没有什么工作 – KyleK

0

对此的解决方案不是一个明显的解决方案,特别来自老版本的laravel。
感谢这个链接。 Auth Session killed in Laravel 5.2
我能解决它,所以我会发布答案,以帮助其他人遇到同样的问题。

本来我只是在我的路线中有这个。

Route::post('app/login', 'Auth\[email protected]'); 

Route::group(['middleware' => ['web','auth']], function() { 
    Route::get('test',function(){ 
     dd(Auth::user());// was always returning null 
    }); 
}); 

但是,要获得登录坚持,我不得不这样做

Route::group(['middleware' =>[ 'web']], function() { 
    Route::post('app/login', 'Auth\[email protected]'); 
}); 

Route::group(['middleware' => ['web','auth']], function() { 
    Route::get('test',function(){ 
     echo Auth::user()->name; 
    }); 
}); 

显然任何途径多数民众赞成要打电话或注册一个会话需要采用“网络”的中间件。