[已解决] 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 却失败的问题。
关于 LearnKu
推荐文章: