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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel身份验证 - 不同表格中的电子邮件相关的知识,希望对你有一定的参考价值。

我有两张桌子:

人数:

id   name   email   phone   person_type_id

用户

id   person_id  password role_id etc...

您能否告诉我如何使用Laravel(5.8)内置的身份验证系统在对用户进行身份验证时使用人员表中的电子邮件字段?仅供参考,守卫提供者的价值必须是用户。

答案

您可以创建自定义用户提供程序(继承自IlluminateAuthEloquentUserProvider)并覆盖retrieveByCredentials方法。

Laravel Docs - The User Provider Contract

另一答案

@ Thomas的建议帮助我解决了这个问题。万一它可以帮助任何人,这是我的代码:

我创建了CustomUserProvider.php

<?php

namespace AppProviders;
use IlluminateSupportStr;
use IlluminateAuthEloquentUserProvider;
use IlluminateContractsHashingHasher as HasherContract;

class CustomUserProvider extends EloquentUserProvider { 

private $method_to_email_model;

public function __construct(HasherContract $hasher, $model, $method_to_email_model)
{

    parent::__construct($hasher, $model);

    $this->method_to_email_model = $method_to_email_model;
}

public function retrieveByCredentials(array $credentials)
{

    if (empty($credentials) ||
       (count($credentials) === 1 &&
        array_key_exists('password', $credentials))) {
        return;
    }

    $query = $this->createModel()->newQuery();

    foreach ($credentials as $key => $value) 
    {
        if (Str::contains($key, 'password')) {
            continue;
        }

        if (is_array($value) || $value instanceof Arrayable) {

            $query->with([$this->method_to_email_model => function($q) use($key, $value){
                $q->whereIn($key, $value);
            }]);

        } else {


            $query->with([$this->method_to_email_model => function($q) use($key, $value){
                $q->where($key, $value);
            }]);
        }
    }

    return $query->first();
 }   

}

然后在App Providers AuthServiceProvider.php文件中,内部启动函数:

Auth::provider('custom_user_provider', function ($app, array $config) {
    return new CustomUserProvider($app['hash'], $config['model'], $config['method_to_email_model']);
});

在config / auth.php里面

 'providers' => [ 
    'users' => [
        'driver'                => 'custom_user_provider',
        'model'                 => AppUser::class,
        'method_to_email_model' => 'person',
    ],
  ],

最后在App User.php(用户模型)

protected $appends = [
    'email', 'first_name', 'last_name'
 ];

public function person()
{
    return $this->belongsTo(Person::class, 'person_id', 'id');
}

public function getEmailAttribute()
{
    return $this->person->getAttribute('email');
}

public function getFirstNameAttribute()
{
    return $this->person->getAttribute('first_name');
}

public function getLastNameAttribute()
{
    return $this->person->getAttribute('last_name');
}

以上是关于Laravel身份验证 - 不同表格中的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Laravel 6 中的 SMTP 服务器上进行身份验证

JWT 从 Laravel 中的令牌中检索经过身份验证的用户

Laravel 4 身份验证不起作用

Laravel 5:使用 Laravel 会话数据的 Socket.io 客户端身份验证

在AuthController中覆盖laravel的5.2身份验证方法

Laravel 4 中的多个身份验证会话