【问题标题】:Laravel 5.2: Auth::check() keeps returning falseLaravel 5.2:Auth::check() 不断返回 false
【发布时间】:2016-01-17 17:01:54
【问题描述】:

我正在启动一个新的 Laravel 5.2 项目,但遇到了一个奇怪的身份验证问题:Auth::check() 不断返回 false。

如果您认为这是重复的,请继续阅读。我尝试了多种建议来解决此问题,但都没有成功。

设置:

  • 应用环境是 Laravel Homestead 的 php-7 分支(Vagrant box)。
  • 用户模型使用 UUID 代替 ID(表已自动递增 id 切换到 36 个字符的 uuid 主键列)。
  • 用户模型 primaryKey 已从 id 更改为 uuid 并且 incrementing 已设置为 false。
  • 使用artisan make:auth 生成要使用的身份验证基线。
  • 已为getLoginpostLogingetEmailpostEmailgetResetpostReset 设置了身份验证路由,并且它们工作正常。
  • web 中间件目前用于应用程序中的所有路由。
  • config 目录中的身份验证配置和会话配置为默认设置(身份验证模型的命名空间更改除外)。
  • 传入无效凭据会正确触发验证错误。
  • AuthController 上登录redirectPath 后确实有效,但guest 中间件劫持了请求并将用户重定向回登录路径。

我可以很好地创建用户并使用创建的路由定义更改他们忘记的密码。我可以在登录路径上“登录”,但Auth::check()guest 中间件(Middleware\Authenticate 类)中总是返回 false。

我尝试了以下会话驱动程序但没有成功:

  • 文件
  • Redis
  • 饼干
  • 数据库

我什至尝试将users 表的主键恢复为名为@9​​87654345@,但这并没有改变任何东西。

我注意到:由于我的用户 ID 实际上是 char(36) UUID,数据库会话驱动程序没有正确保存 user_id:它保存了来自用户 UUID 的 integer 字符,然后截断其余的值(例如,users.uuid 3f2358907afafaf 变为 session.user_id 3),或者如果用户 ID 以非数字字符 (a-f) 开头,则为 0

我发现了大量关于同一问题的问题、主题和搜索结果。我尝试了大多数人认为可行的方法,但我没有让它仍然有效:

  • 我已将 $user->primaryKey 受保护属性设置为 uuid(这也会影响 $model->getKey()$model->getAuthIdentifier())。
  • 我尝试了多个不同的会话驱动程序,但均未成功。
  • 我已尝试恢复为 users.id 列名而不是 users.uuid,没有变化。
  • 我已经清除了所有我能想到的缓存。
  • 我已经检查过在视图输出之前没有空白输出(需要深入挖掘,以防我错过了一些文件)。

唯一我还没有正确尝试过的事情是只为用户切换回自动递增的 ID(而不是 UUID)。我已经将 UUID 概念紧密联系在一起了,但我会看看我能做些什么来解决这个问题。

如果我在这个问题中遗漏了什么,请询问详细信息。

【问题讨论】:

    标签: php session authentication laravel-5 uuid


    【解决方案1】:

    我认为 laravel 有一个错误。在执行Auth::attempt() 后,它经常在每个Auth::check() 上不断返回false

    尝试将 Kernel.php 中的$middleware[]; 编辑为:

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    ];
    

    我希望它会起作用。

    【讨论】:

    • 如果Auth::check() 在错误页面上失败,这个也有帮助。
    • 这似乎引发了另一个问题:登录期间的身份验证错误,如果我将\Illuminate\Session\Middleware\StartSession::class 添加到全局中间件,则错误消息不再显示。谁能证实这一点?
    • 好的。最后提到的问题是由于我的 Http/Kernel.php 配置错误而引起的。我必须从我的 $middlewareGroups 数组中删除 \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class 才能使其工作。
    【解决方案2】:

    Laravel 的 Eloquent 模型假设每个表都有一个名为 id 的主键列。

    因此,如果您将用户表的主键更改为其他内容,则不会设置您的身份验证会话。

    你应该定义一个 $primaryKey 属性来覆盖这个约定,就像在 Model 类中定义 $table 一样:

    protected $primaryKey = "your_field_ID";
    

    可能会迟到,但应该可以帮助其他来这里寻找答案的人。

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 2015-03-03
      • 2016-06-08
      • 2018-09-08
      • 2015-12-14
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多