在laravel multi-authentication中

时间:2017-06-20 14:50:03

标签: laravel authentication

我在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,
        ],
],

2 个答案:

答案 0 :(得分:0)

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

protected function credentials(Request $request)
{
    return $request->only('MDCN', 'password');
}

答案 1 :(得分:0)

我终于解决了这个问题,谢谢Alex Curtis。 为此,您需要自定义每个模型以告诉它您要用于登录的内容。

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

public function username()
{
    return 'username';
}

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

显然,您还需要确保数据库中有一列用于保存此数据,您希望它可以批量分配(通过自定义模型中的$ fillable数组),并且您还希望该列为索引和唯一。

要实现此目的,您需要在迁移中创建如下所示的列:

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

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

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