关于获取登录用户的问题?

当添加 middleware api.auth 或者在 auth('web')->user() 前调用 $this->user() $this->auth 等:
auth('api')->user() auth('web')->user() 均能获取用户 且为相同用户
当不添加 middleware api.auth 或不进行上述调用时:
auth('api')->user() 可以获取用户 auth('web')->user() 不能获取用户
个人认为调用 API 时应该能获取 auth('api')->user() 不能获取 auth('web')->user() 才是正确的情况
在查看源码寻找原因时发现:
file
file
file
此处 AuthTymon\JWTAuth\Providers\Auth\Illuminate
file
嵌套调用发现先最终 Auth 是用的 laravelSessionGuard 但是还没没找到覆写不同 guard 的登录用户代码

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 5
liyu001989
  1. 使用 postman 测试 并不能通过 auth ('web')->user () 得到用户,你是浏览器测试?
  2. 并不是使用 SessionGuard 使用的是 vendor/tymon/jwt-auth/src/JwtGuard.php。再仔细阅读一下源码,你可以看看这里的回答 问答:Auth::guard ('API')->attempt ($credentials)) 到底是什么?
7年前 评论

@liyu001989

代码示例

加载鉴权中间件 middleware => api.auth 情况

file
file

不加载鉴权中间件 middleware => api.auth 请求时无头部鉴权信息 Authorization

file

file

不加载鉴权中间件 middleware => api.auth 请求时携带头部鉴权信息 Authorization

file
file

---------- 分割线 ------------

file

file

-------------- 分割线 --------------

file

file

调用 $this->user``$this->auth 会和采用中间件 api.authauth('web') 的结果起用一样的影响

7年前 评论

@liyu001989

重新查看了整个 api.auth 中间件调用流程发现了问题所在

file

file

file

file

file

file

file

file

7年前 评论

当使用中间件 auth:api

file

file

不使用中间件 auth:api

file

file

7年前 评论
liyu001989

明白你的意思了,给你点个赞先。

中间件调用 authenticate,最终使用了 sessionGuard setUser。

因为 auth 使用了配置中指定的 Tymon\JWTAuth\Providers\Auth\Illuminate,其中注入的是默认的是 Illuminate\Contracts\Auth\Guard。可能修改这里会达到你的预期。

file

file

不过为什么要纠结这里,你有什么特殊的业务逻辑吗

7年前 评论