dingo/API 的 api.auth 中间件对于不同用户表认证问题

表示很想知道在 config/api.php 中配置完

'auth' => [
    'jwt' => 'Dingo\Api\Auth\Provider\JWT',
]

之后给路由添加 dingo/apiapi.auth 中间件,用户认证时默认采用的 Guard 为什么是 config/auth.php 中配置的 api Guard,它们之间是从哪里联系的?

在做不同用户表认证时,api guard 的 Provider 是 users,这样就会只对前台用户(users)做认证,是否有办法使用 api.auth 中间件做用户认证时可以配置不同 Guard 呢?(例如我配置一个 admin_api guard 它的 provideradmin_users,不同用户表的用户认证时进行切换 Guard)

Google 和百度之后,发现很多人的做法是自定义一个后台用户认证的中间件,在做后台用户认证的时候,在中间件中动态修改 api guardprovider 指向,达到不同用户表认证的目的,可是这种动态修改配置的做法不就失去了配置的意义吗?有没有更好的办法?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
liyu001989
最佳答案

@Apodabird dingo 没有处理不同 guard 之间的切换,始终使用的是默认的 guard,等待新的 pr 吧

总结一下

  1. 始终使用 api.auth 中间件,像你的做法,提前切换一下默认的 guard;
  2. 使用 Laravel 的 auth 中间件,auth:api 和 auth:admin 切换很方便,但是要注意,controller 中需要使用 auth('api')->user() 获取用户,不能使用 $this->user() 否则会多查询一次用户。

貌似有多用户的情况用自带的会更加方便一点

6年前 评论
讨论数量: 6
liyu001989

@Apodabird

最好的方式应该是 像默认的 auth 中间件一样,可以传参数,auth:api 或者 auth:admin。但是 dingo 的 api.auth 在验证之后会将用户记录下来,这样 controller 中才能使用 $this->user () 获取当前用户。

等我明天整理一下再回复你

6年前 评论

@liyu001989
感谢回复
目前的做法是这样的,我定义了一个 DefineAPIGuardProvider 中间件,传递不同参数去修改了配置中的 api guard 的 provider 指向(users or admin_users)

6年前 评论
liyu001989

@Apodabird dingo 没有处理不同 guard 之间的切换,始终使用的是默认的 guard,等待新的 pr 吧

总结一下

  1. 始终使用 api.auth 中间件,像你的做法,提前切换一下默认的 guard;
  2. 使用 Laravel 的 auth 中间件,auth:api 和 auth:admin 切换很方便,但是要注意,controller 中需要使用 auth('api')->user() 获取用户,不能使用 $this->user() 否则会多查询一次用户。

貌似有多用户的情况用自带的会更加方便一点

6年前 评论

@arfurs 我也碰到这个问题,请问 DefineAPIGuardProvider 怎么实现的?
@liyu001989 老师 api.auth 这个中间件在哪里注册的,我怎么查看

6年前 评论
Cwift

@liyu001989 问下现在 dingapi 支持切换 guard 了吗

5年前 评论
liyu001989

@Cwift 貌似不能

5年前 评论