自定义中间件中Auth::check()返回false,问题原因是什么?
Auth::check()返回false的常见原因 我来梳理下实际开发中踩过的坑,导致自定义中间件里Auth::check()返回false的核心原因大概有这些:
中间件执行顺序搞反了:Laravel的中间件是按注册顺序依次跑的,如果你的自定义中间件放在
StartSession、AuthenticateSession这类会话初始化中间件之前,那会话还没启动,Auth根本拿不到用户信息。一定要把自定义中间件放在web中间件组之后,或者在app/Http/Kernel.php里明确把它排在Session相关中间件的后面。路由没绑定web中间件组:要是你的路由没加到web中间件组里,Session、Cookie这些认证依赖的机制都没启用。比如把路由写到api中间件组里,api组默认是无状态的,用token而非Session认证,这时候
Auth::check()肯定返回false——它默认用的是web guard的Session驱动。Guard配置不匹配:如果用户登录时用的是web guard,但你的中间件里误指定了其他Guard(比如
Auth::guard('api')->check()),或者config/auth.php里的默认Guard配置错了,都会导致Auth::check()识别不到已登录用户。会话存储出问题了:比如用文件驱动时Session目录权限不足,用Redis/Memcached驱动时缓存服务连接失败,导致用户登录后的会话数据没存下来;或者中间件逻辑里不小心调用了
Auth::logout(),提前销毁了会话。Cookie或跨域配置不对:前后端分离场景下,前端请求没携带Session Cookie,或者Cookie的domain、path、secure属性和当前环境不匹配(比如本地开发开了secure),后端接收不到会话标识,自然识别不了用户。
内容的提问来源于stack exchange,提问作者Andrey

