我正在开始一个新的Laravel 5.2项目,并且我遇到了一个奇怪的身份验证问题:Auth::check()
不断返回false。
如果您认为这是重复的,请继续阅读。我已经尝试过多个建议来解决这个问题而没有运气。
设置:
php-7
分支(Vagrant box)。id
切换为36个字符的uuid
主键列),则用户模型会使用UUID。primaryKey
已从id
更改为uuid
,incrementing
已设置为false。artisan make:auth
生成要使用的身份验证基线。getLogin
,postLogin
,getEmail
,postEmail
,getReset
和postReset
设置了身份验证路由,但这些路由工作正常。 web
中间件目前用于应用程序中的所有路由。config
dir中的Auth配置和会话配置是默认值(auth模型的命名空间更改除外)。redirectPath
上的AuthController
确实有效,但guest
中间件劫持了请求并将用户重定向回登录路由。我可以创建用户并使用创建的路径定义更改他们忘记的密码。我可以"登录"在登录路由上,Auth::check()
始终在guest
中间件(Middleware\Authenticate
类)中返回false。
我尝试了以下会话驱动程序但没有成功:
我甚至尝试将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概念搞得很紧,但我会看看我能做些什么来解决这个问题。
如果我在这个问题上遗漏了什么,请详细询问。
答案 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";
可能会迟到,但应该帮助那些来这里寻找答案的人。