Laravel 5.2:Auth :: check()不断返回false

时间:2016-01-17 17:01:55

标签: php session authentication laravel-5 uuid

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

如果您认为这是重复的,请继续阅读。我已经尝试过多个建议来解决这个问题而没有运气。

设置:

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

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

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

  • 文件
  • Redis的
  • 曲奇
  • 数据库

我甚至尝试将users表主键还原为名为id,但这并没有改变任何内容。

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

我发现了同样问题的大量问题和线索以及搜索结果。我尝试了大多数人认为可以工作的东西,但我还没有让它继续工作:

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

我还没有正确尝试过的唯一事情就是切换回用户的自动递增ID(而不是UUID)。我已经把UUID概念搞得很紧,但我会看看我能做些什么来解决这个问题。

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

2 个答案:

答案 0 :(得分:1)

我认为laravel有一个bug。在执行false

后,它通常会在每个Auth::check()上返回Auth::attempt()

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

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

我希望它能奏效。

答案 1 :(得分:1)

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

因此,如果您已将Users表的主键更改为其他内容,则不会设置您的Auth会话。

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

protected $primaryKey = "your_field_ID";

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