在 laravel 多身份验证中为单个守卫自定义登录凭据

Posted

技术标签:

【中文标题】在 laravel 多身份验证中为单个守卫自定义登录凭据【英文标题】:customizing login credentials for a single guard in laravel multi-authentication 【发布时间】:2017-11-23 04:38:30 【问题描述】:

我在我的 laravel 应用中设置了多重身份验证。我为管理员、医生和患者设置了不同的警卫和提供者。我还在config\auth.php 中为各种警卫设置了重定向。 我现在唯一遇到的问题是,我希望医生使用一个名为 MDCN 的唯一号码登录,该号码保存到数据库表而不是电子邮件中。请问如何自定义医生的登录名? Ps:我也为每个设置了模型,并且我使用 laravel 默认身份验证。

我的后卫:

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

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

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'admin-api' => [
            'driver' => 'token',
            'provider' => 'admins',
        ],

        'doctor' => [
            'driver' => 'session',
            'provider' => 'doctors',
        ],
        'doctor-api' => [
            'driver' => 'token',
            'provider' => 'doctors',
        ],
    ],

和提供者:

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

        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],

        'doctors' => [
            'driver' => 'eloquent',
            'model' => App\Models\Doctor::class,
        ],
],

【问题讨论】:

【参考方案1】:

App\Http\Controllers\Auth\LoginController 中,您可以覆盖一个方法,该方法通过应检查身份验证的字段返回,您可以在那里通过 MDCN如果您正在记录医生:

protected function credentials(Request $request)

    return $request->only('MDCN', 'password');

【讨论】:

但这不会影响其他守卫吗?喜欢使用电子邮件和密码登录的用户? @OkoroaforChukwuemeka 是的,这将影响所有登录,因此当只有医生登录以获取 MDCN 而不是电子邮件时,您必须检查某些情况。【参考方案2】:

感谢 Alex Curtis,我终于解决了这个问题。 为此,您需要自定义每个模型,告诉它您要使用什么来登录。

因此,在您想使用用户名而不是电子邮件登录的任何模型上,您需要将此代码块添加到模型中:

public function username()

    return 'username';

只需确保您返回的值(本例中的用户名)与该模型表中具有您要使用的标识符的列名相匹配。

显然,您还希望确保数据库中有一个列来保存这些数据,您希望它是可批量分配的(通过自定义模型中的 $fillable 数组)并且您还希望该列是索引且唯一。

要获得此信息,您需要在迁移中创建如下所示的列:

$table->string('username')->unique();

这将为该列创建一个唯一索引。

默认为电子邮件,因此如果您使用电子邮件,则无需担心这一点,但任何使用电子邮件以外的其他东西的模型都需要对该用户类型的模型进行此更改。

【讨论】:

以上是关于在 laravel 多身份验证中为单个守卫自定义登录凭据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 自定义多重身份验证

如何在 Laravel 中为 REST API 创建身份验证

Laravel身份验证 - 不同表格中的电子邮件

如何在 laravel 刀片模板中检查当前的身份验证守卫及其来宾?

Laravel 7 将默认守卫更改为员工,但当前经过身份验证的用户返回 null

为 JWTAuth 身份验证 Laravel 5.5 指定除默认值之外的其他守卫/提供者