【问题标题】:Auth not persisting in Laravel 5.2Auth 在 Laravel 5.2 中不存在
【发布时间】:2016-03-10 15:51:32
【问题描述】:

我的身份验证在登录时执行此操作。

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');
} 

但是,在重定向到仪表板之后。看来身份验证没有持久化。如果我这样做 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
     });
});

我做错了什么?

这很奇怪,昨晚它还在工作。它有点神奇地停止了工作。

【问题讨论】:

  • 如果您在dd 之后attempt,则会话不一定保持不变。如果您只是返回一个空字符串作为响应而不是重定向,然后手动转到测试路由,会发生什么?
  • 另外,您可以通过调用login 来代替attempt 进行进一步调试,并强制登录用户。这至少可以规避实际授权的潜在问题。这很可能是 cookie 或会话问题 :)

标签: php laravel authentication laravel-5.2


【解决方案1】:

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

最初我的路线中只有这个。

Route::post('app/login', 'Auth\AuthController@doLogin');

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\AuthController@doLogin');
});

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

显然,任何要调用或注册会话的路由都需要使用“网络”中间件。

【讨论】:

    【解决方案2】:

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

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

    现在,如果这可行,那么您可以确定 Laravel Auth 确实在保留用户,并且问题出在您代码中的其他地方。

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

    【讨论】:

    • Laravel 5.2 使用 web 中间件。不需要 auth 中间件。但是,如果我像您所说的那样添加 Auth 中间件。它只是将我重定向回登录页面。我觉得奇怪的是 Auth 尝试似乎返回了一个有效的登录名。它只是“忘记它”的重定向。因此,使用“网络”中间件,我只会在重定向时得到一个空白页面。使用 auth 中间件,我被重定向回登录页面。
    • Web 中间件具有 CSRF 和 XSS 保护之类的功能,它也不会检查用户是否已登录。只是想指出,您实际上可以检查 Auth 在登录时是否在做它应该做的事情通过保护您在组内通过“网络”中间件保护的一条路由,让用户进入应用程序,以确保 Auth 正常工作。如果是(如果未登录则不允许您访问),那么您的问题出在代码中的其他地方:)
    • 好的,但是即使添加了 auth 中间件,我也只是在登录时被重定向,回到登录页面。即使身份验证控制器中的 dd(Auth::user()) 显示登录用户?所以我说的是,对于一个请求,登录似乎正在工作,但在重定向时,它不会持续存在,因此重定向回登录页面。试过会话驱动、数据库驱动、文件驱动什么的。似乎没有任何效果
    • 好的,我在这里找到了解决方案....laracasts.com/discuss/channels/laravel/… 显然,所有要举行会话的路由都必须在网络中间件中。所以我也不得不把我的登录路径放在那个中间件里面。但是,现在我得到一个令牌不匹配错误....大声笑但至少登录部分已解决。
    • 完全忘记了 :) 您的表单中出现令牌不匹配的情况,可能是因为您没有使用 _token 字段并将其添加到该表单中?
    猜你喜欢
    • 2017-01-06
    • 2017-01-06
    • 2016-04-02
    • 2023-03-05
    • 2016-05-13
    • 1970-01-01
    • 2016-05-07
    • 2016-12-25
    • 2016-06-08
    相关资源
    最近更新 更多