Laravel Passport 自定义获取授权用户的实现方案 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区

最近有个项目使用了 Laravel Passport 来实现后端 API 的授权过程,整体用起来还是还顺利的,不过有个细节文档里面也并没有写,可以分享一下。

正常业务中,我们在通过请求中的 credentials 获取用户的时候,实际业务经常可能需要支持多个字段登入(比如同时去检查邮箱或者手机号码的匹配),或者需要检测用户是否被禁用之类的逻辑,可以统称为获取授权用户业务逻辑。

在 Laravel Passport 的源码中其实已经相应的去检查的对应 Guard 的 model 是否存在一个 findForPassport 方法:

# ./vendor/laravel/passport/src/Bridge/UserRepository@getUserEntityByUserCredentials

if (method_exists($model, 'findForPassport')) {
    $user = (new $model)->findForPassport($username);
} else {
    $user = (new $model)->where('email', $username)->first();
}

所以我们只需要给在 config/auth.php 配置的 Guard 对应的资源 model 添加一个 findForPassport 就方法可以,而不用再去通过中间件或者其他的方式实现:

# app\User.php

// 通过 phone 查找没有在禁用状态下的用户:
public function findForPassport($username)
{
    return \App\User::normal()
        ->where('phone', $username)
        ->first();
}

public function scopeNormal($query)
{
    return $query->where('status', self::STATUS_NORMAL);
}

Done!

优帆远扬 —— 提供优质的软件外包服务

本帖已被设为精华帖!


Original url: Access
Created at: 2018-11-01 18:21:41
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论