[已解决] 5.2 为什么登陆验证成功后依旧无法通过自带的 Authenticate 中间件?
原问题:
最开始用框架自带的用户模块能正确运行,但是几个星期前我为了整体的整洁和美观,将 App\User.php
放到了 App\Models
下,同时修改了相关的代码,便开始出现无法登录的问题——点击登录后依旧跳转回登录页,同时手动输入被 auth
拦截的路由依然会跳转回登录页(即登录失败)。
登录失败后,我检查了数据库,remember_token
字段已被更新,同时检查了浏览器的 cookie
, 确实有 laravel_session
的值存在;我又重新注册了一个账号——能被成功注册,但不能自动登录,并且依旧点击登录后跳转回登录页面,没有任何错误提示。
于是我在自带的登录的 login
方法和 Authenticate
中间件里加了一个日志的输出,检测是否登录,结果登录时能检测通过,但是中间件里总是不通过,下面是截图:
我接下来该怎么办?
解决过程:
我在一路读源码 + 疯狂查找时,对 session
产生了疑惑,因为貌似没有登陆的情况下,laravel_session
也是有值的,便在上图的 login
方法和 Authenticate
中间件 handle
方法里加入了:dd($request->session()->all());
于是看到了 login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
这一串东西的值为 0
,通过对比了另外一个正常的项目的这串 key
的 value
,发现这串 key
对应的 value
应该是 user_id
,肯定是 session
写入的时候有问题。于是我开始全局查找 "login_web"
,并没有找到内容,重新搜索 “login”
,找到了位于 Illuminate\Auth\SessionGuard
的函数,正是这一段代码代表着用户登入时的 session
所保存的内容。
于是再度检索该 key
的 set
方法,终于找到了原因——我的 App\Models\User.php
里面设置了$primaryKey = 'username'
,却没有设置 $keyType = ‘string’
, 导致在保存 session
时,将 username
的值按照默认的 int
类型进行保存,所以存成了 0
, 导致登录时 Auth::user()
获取成功,而在登录之后写入 session
却失败的问题。
推荐文章: