Laravel 5.3 Auth 外观正在更改为默认的经过身份验证的用户

Posted

技术标签:

【中文标题】Laravel 5.3 Auth 外观正在更改为默认的经过身份验证的用户【英文标题】:Laravel 5.3 Auth facade is changing to a default authenticated user 【发布时间】:2017-12-27 06:41:45 【问题描述】:

所以我在我的 laravel 网站中有一个自定义登录流程。用户位于可通过 API 访问的外部数据存储中。流程基本上是这样的。 (缩小)

public function login(Request $request) 
    $resultFromAPI = //call external API with email and password from $request
    if($resultFromAPI) 
        $user = User::find($resultFromAPI->user->user_id);
        if($user)  //user exists
             Auth::login($user);
             //dump( Auth::user() );
             return redirect('/');
         else 
             $user = User::create([...]); //from $resultFromApi->user
             Auth::login($user);
             //dump( Auth::user() );
             return redirect('/');
        
    

如果我尝试使用user2@example.com 登录,转储将显示该用户的对象。但是,我被重定向到 /Auth::user() 的第二个将是 user1@example.com 我的本地数据库显示了这两个用户记录,但它默认为第一个用户。我正在使用默认注销功能来注销并清除会话,并且我已经确认在调用注销功能时Auth::user() 为空。我被卡住了。

编辑:我尝试了Auth::attempt(...) 而不是Auth::login(...),它没有改变任何东西

EDIT2:我从头开始使用全新安装的 laravel 5.4,将登录部分重写为这个

if ($this->attemptLogin($request)) 
  $request->session()->regenerate();
  $this->clearLoginAttempts($request);

  return $this->sendLoginResponse($request);

而不是这个

Auth::login($user);
return redirect('/')

还是一样的问题

【问题讨论】:

你没有忘记一些测试代码,比如Auth::loginUsingId($user_id, true); 或类似的东西吗?? 我跟踪了从调用/login 到重定向到/ 的流程,包括中间件。 (我在路由中使用了auth 中间件)我什至在整个目录中搜索了Auth::,并没有发现任何异常。 假设电子邮件user2@example.com的用户id = 2,尝试使用Auth::loginUsingId(2, true);而不在login方法中调用你的外部api,然后return redirect('/');看它是否会生成同样的问题!! 还是同样的问题。用user1@example.com 重定向我。我尝试回显电子邮件(Auth::user()->email)并注释掉重定向功能,我得到了user2@example.com 【参考方案1】:

终于解决了问题。我的主键是从我的外部 api 检索到的自定义 uuid。我将主要的 ley 恢复为默认的($table->increments('id'); 并且它有效。

我looked it up,原来我可以在我的用户模型中完成public $incrementing = false;,它会阻止 Laravel 认为它是一个递增字段,这可能已经解决了它,但我还没有测试那。

【讨论】:

以上是关于Laravel 5.3 Auth 外观正在更改为默认的经过身份验证的用户的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 Auth 阻止用户

Laravel 5.2 auth 将 'id' 更改为 'customer_id'

如何在 jwt laravel 5.3 中处理令牌到期?

更改 Laravel auth 表名和列名

在 laravel 5.3 中删除哈希进程

为啥 Auth::attempt 在 Laravel 5.3 中总是返回 false?