passport 多用户使用不同模型,发放令牌和验证

简介#

passport 多用户登录,刚好自己也做了相关的操作,就记录一下怎么做的。不知道和你们想要的效果是不是这样的。

1. 安装 passport#

文档有教程,就不再叙述

2. config/auth 授权看守器,增加多个模块#

配置文件 config/auth.php 中授权看守器
guards 内可以设置多个 driver 为 passport 的模块
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],

        'wechat' => [
            'driver' => 'passport',
            'provider' => 'members',
        ]
    ],

3. 定义 providers#

这里定义不同的 eloquent 模型
'providers' => [

        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

        'members' => [
            'driver' => 'eloquent',
            'model' => App\Models\Member::class,
        ],
    ],

4. 生成指定 guard 的加密秘钥#

artisan passport:client --password --provider // 生成密码授权
# --provider  指定 guard
# 为令牌命名 例如:wechat
What should we name the password grant client? [Laravel Password Grant Client]:
> wechat

# 回车确认

# 随后会出现选择 guard 的询问栏,选择你之前定义的看守器对应的 eloquent 模型
# 输入对应数字即可 示例:1
Which user provider should this client use to retrieve users? [users]:
[0] users
[1] members
>1

5. 配置路由分组#

修改routes下对应的路由文件
Route::middleware('auth:api')->group(function () {
        // api端验证的走这里
});

Route::middleware('auth:wechat')->group(function () {
        // wechat端验证的走这里
});

6. 使用之前生成 client_id 和 secret 发放令牌#

结语:前后台分离或者区分app端,小程序端等,都是可以的
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

这个看了更新文档后也才知道这个功能,也都使用上了。文档太低调了

3年前 评论
kkokk (楼主) 3年前

请问如果这样的话,策略和门怎么去使用?策略和门似乎只支持单用户模型,在同一个数据模型中。

3年前 评论
kkokk (楼主) 3年前

@Z_Laravel 大佬,请教下,您的 token 过期校验和刷新是怎么处理的呀?

2年前 评论
kkokk (楼主) 2年前
carveybunt (作者) 2年前
kkokk (楼主) 2年前

修改状态码,用异常处理会不会更方便一点?不过也不知道异常处理要捕获那个 exception。毕竟 passport 返回的信息都是英文也不只支持 local。 中间件我只想用来做 token 刷新机制。

2年前 评论
kkokk (楼主) 2年前

这种情况下 createToken ('name')->accessToken; 不适用,因为 createToken 只能用配置好的 PASSPORT_PERSONAL_ACCESS_CLIENT。

2年前 评论

laravel 5.8 没法直接就这样子用... 得加 provider 自定义 UserRepository.php

2年前 评论