如何使用带有自定义用户名列的 Laravel Passport

Posted

技术标签:

【中文标题】如何使用带有自定义用户名列的 Laravel Passport【英文标题】:How to use Laravel Passport with a custom username column 【发布时间】:2017-01-04 19:34:45 【问题描述】:

现在我正在使用类似的东西在我的基础站点上对用户进行身份验证:

if (Auth::attempt($request->only(['id', 'password']))) 
            //

如何修改此代码以使用自定义列作为用户名? https://laravel.com/docs/5.3/passport#password-grant-tokens

【问题讨论】:

【参考方案1】:

回答有点晚了,但我一直很难弄清楚这一点,所以为了完整起见并可能在未来帮助其他人。

如果您查看this part of passport's code,您会发现它也在寻找validateForPassportPasswordGrant 方法,因此除了Alexander 的回答之外,这就是您可以使用自定义字段对用户进行身份验证的方式。

希望对某人有所帮助。

【讨论】:

【参考方案2】:

您可以在用户模型中使用 findForPassport 方法。

此方法以用户名作为参数,并返回用户模型

例如:

class User extends Authenticatable

    use HasApiTokens, Notifiable;

    // ... some code

    public function findForPassport($username) 
        return $this->where('id', $username)->first();
    

【讨论】:

如果密码也存储在单独的数据库表中呢?或者,如果凭据由第三方 API 验证(在后台)? 如果您的自定义列名为username,您可能需要使用return $this->where('username','=', $username)->first(); 如果我必须同时使用电子邮件和手机号码登录怎么办 @swatantra 你可以使用类似$this->where(fn($q) => $q->where('email', $username)->orWhere('phone', $username)); 是的,我确实已经这样做了,它有帮助,谢谢

以上是关于如何使用带有自定义用户名列的 Laravel Passport的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:如何设置带有条件的自定义列?

如何在 laravel 4.2 中使用带有自定义预过滤器的 AJAX 上传 CSV 文件

用户未经授权时的 Laravel 护照自定义错误消息和状态码

Laravel 重命名列丢失所有数据

使用带有附加参数的自定义规则验证 Laravel 中的数组

Laravel,如何从自定义表的 jwt 令牌获取登录用户