【发布时间】: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生成要使用的身份验证基线。 - 已为
getLogin、postLogin、getEmail、postEmail、getReset和postReset设置了身份验证路由,并且它们工作正常。 -
web中间件目前用于应用程序中的所有路由。 -
config目录中的身份验证配置和会话配置为默认设置(身份验证模型的命名空间更改除外)。 - 传入无效凭据会正确触发验证错误。
- 在
AuthController上登录redirectPath后确实有效,但guest中间件劫持了请求并将用户重定向回登录路径。
我可以很好地创建用户并使用创建的路由定义更改他们忘记的密码。我可以在登录路径上“登录”,但Auth::check() 在guest 中间件(Middleware\Authenticate 类)中总是返回 false。
我尝试了以下会话驱动程序但没有成功:
- 文件
- Redis
- 饼干
- 数据库
我什至尝试将users 表的主键恢复为名为@987654345@,但这并没有改变任何东西。
我注意到:由于我的用户 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