[已解决] 5.2 为什么登陆验证成功后依旧无法通过自带的 Authenticate 中间件?

原问题:
最开始用框架自带的用户模块能正确运行,但是几个星期前我为了整体的整洁和美观,将 App\User.php 放到了 App\Models 下,同时修改了相关的代码,便开始出现无法登录的问题——点击登录后依旧跳转回登录页,同时手动输入被 auth 拦截的路由依然会跳转回登录页(即登录失败)。

登录失败后,我检查了数据库,remember_token 字段已被更新,同时检查了浏览器的 cookie, 确实有 laravel_session 的值存在;我又重新注册了一个账号——能被成功注册,但不能自动登录,并且依旧点击登录后跳转回登录页面,没有任何错误提示。

于是我在自带的登录的 login 方法和 Authenticate 中间件里加了一个日志的输出,检测是否登录,结果登录时能检测通过,但是中间件里总是不通过,下面是截图:

file

file

file

我接下来该怎么办?


解决过程:
我在一路读源码 + 疯狂查找时,对 session 产生了疑惑,因为貌似没有登陆的情况下,laravel_session 也是有值的,便在上图的 login 方法和 Authenticate 中间件 handle 方法里加入了:
dd($request->session()->all());
于是看到了 login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d 这一串东西的值为 0,通过对比了另外一个正常的项目的这串 keyvalue,发现这串 key 对应的 value 应该是 user_id,肯定是 session 写入的时候有问题。于是我开始全局查找 "login_web",并没有找到内容,重新搜索 “login”,找到了位于 Illuminate\Auth\SessionGuard 的函数,正是这一段代码代表着用户登入时的 session 所保存的内容。
于是再度检索该 keyset 方法,终于找到了原因——我的 App\Models\User.php 里面设置了$primaryKey = 'username',却没有设置 $keyType = ‘string’, 导致在保存 session 时,将 username 的值按照默认的 int 类型进行保存,所以存成了 0 , 导致登录时 Auth::user() 获取成功,而在登录之后写入 session 却失败的问题。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 3

登录为什么还要走Authenticate这个中间件?

7年前 评论

@SnailCoder 登录时没走,登录之后重定向到主页时走了

7年前 评论

问题来了,是怎么解决的??更改源码???

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!