Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel 5.4中添加自定义用户提供程序_Php_Laravel_Laravel 5.4 - Fatal编程技术网

Php 如何在Laravel 5.4中添加自定义用户提供程序

Php 如何在Laravel 5.4中添加自定义用户提供程序,php,laravel,laravel-5.4,Php,Laravel,Laravel 5.4,我有一个Laravel5.4应用程序,在其中我必须通过外部API验证我的管理员用户,当成功登录时,它会返回一个包含用户信息的JSON 我正在创建一个自定义防护,以实现以下目标: 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users' ], 'custom' => [

我有一个Laravel5.4应用程序,在其中我必须通过外部API验证我的管理员用户,当成功登录时,它会返回一个包含用户信息的JSON

我正在创建一个自定义防护,以实现以下目标:

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

        'custom' => [
            'driver' => 'session',
            'provider' => 'customusers'
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
这是我的自定义提供程序:

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

    'customusers' => [
        'driver' => 'jsonresponse',
        'model' => App\Admin::class,
    ]
],
在那之后,我不知道如何继续。我读过一些教程,比如,我创建了一个自定义用户提供程序(现在我只需要它从EloquentUserProvider扩展,最终我将覆盖一些函数以连接到API)

在config/app.php中

'providers' => [

    // Lots of other providers

    // Own providers
    App\Providers\CustomUserProvider::class,
],
但在那之后,我得到了以下错误:

参数1传递给 Illumb\Auth\EloquentUserProvider::\uu构造()必须是 Illumb\Contracts\Hashing\Hasher的实例,的实例 给定的照亮\基础\应用程序,在中调用 /var/www/public/iberorides/vendor/laravel/framework/src/illusted/Foundation/Application.php 在第612行并定义

如果重写CustomUserProvider的构造函数并更改AuthServiceProvider中闭包中的参数,则会出现以下错误:

传递参数1以照亮\Foundation\Application::bootProvider() 必须是Lightlight\Support\ServiceProvider的实例,或 App\Providers\ibrouserProvider已给定,已调用 /var/www/public/iberorides/vendor/laravel/framework/src/illusted/Foundation/Application.php 第771行,并定义

这让我觉得我做事情的方式不对

有人能给我指出正确的方向吗


非常感谢。

解决方案很简单

首先,不管其他教程怎么说,您不必在配置提供程序中注册
CustomUserProvider
(此处为Laravel 5.4)。这就是我犯错误的原因

我只需要重写
EloquentUserProvider
中的两个方法,
retrieveByCredentials(array$credentials)
根据提供的凭据返回模型,以及
validateCredentials(UserContract$user,array$credentials)
根据凭据是否正确返回布尔值

您可以将同一个自定义提供程序类用于多个提供程序,而不仅仅是一个,例如

'providers' => [
    'customusers' => [
        'driver' => 'jsonresponse',
        'model' => App\User::class,
    ],

    'customadmins' => [
        'driver' => 'jsonresponse',
        'model' => App\Admin::class,
    ],
],

之后,当您需要向任何提供者检查auth时,您需要将提供者作为guard提供,例如,
auth::guard('customusers')
我发现没有一个解决方案对我有效,因此我想出了一个非常简单的方法。(Laravel 5.4

我的问题是,我必须允许用户也用他们的电话号码登录

我覆盖了EloquentUserProvider:

class PhoneUserProvider extends EloquentUserProvider
{
    public function retrieveByCredentials(array $credentials)
    {
        if (!$credentials) {
            return null;
        }

        // Fallback to original email authorization
        if (filter_var($credentials['email'], FILTER_VALIDATE_EMAIL)) {
            return parent::retrieveByCredentials($credentials);
        }

        // Assume we are logging in with a phone number
        return UserModel::where('phone', $credentials['email'])->first();
    }
}
在我的
AppServiceProvider
boot方法中,我添加了以下几行:

Auth::setProvider(新的PhoneUserProvider(app(Hasher::class)、UserModel::class))


您甚至可以根据某些条件等在登录控制器中设置提供程序。

可以通过AuthServiceProvider引导方法中的以下代码对EloquentUserProvider进行非常小的自定义

Auth::provider('eloquent', function($app, array $config)
{
  return new class($app['hash'], $config['model']) extends \Illuminate\Auth\EloquentUserProvider
  {

  };
});

如果其他人正在寻找自定义
retrieveByCredentials
方法的方法,则可以在不实现自定义用户提供程序的情况下进行自定义。EloquentUserProvider只需获取一个凭证数组,并使用数组中每个键/值对的where子句构建一个用户查询。因此,如果您已经有一个定义这些凭证的类,您可以在那里进行简单的自定义

在我的例子中,我有一个ResetPasswordController,它实现了ResetsPasswords。我希望在提交过程中修改用户的选择方式(使用id和密码,而不是电子邮件和密码),因此我覆盖了
凭证
方法,将电子邮件替换为id\u联系人,如下所示:

ResetsPasswords实现中还有一些地方需要定制,以便将我的特定用例付诸实践(加上密码重置表单本身)。采用这种方法时,每种情况都会略有不同。但根据您的具体需求,这可能会为您指明一些有用的方向。

正如@Mark Baaijens所说

在您的
AuthServiceProvider中

public function boot()
    {
        $this->registerPolicies();

        Auth::provider('eloquent', function($app, array $config) {
            return new class ($app['hash'], $config['model']) extends EloquentUserProvider {

                public function retrieveById($identifier)
                {
                    $model = $this->createModel();

                    $condition = [$model->getAuthIdentifierName() => $identifier];


                    if ($model instanceof User) {
                        $condition['custom_more_filed'] = 1;
                    }

                    return $model->newQuery()
                                 ->where($condition)
                                 ->first();
                }
            };
        });
    }

谢谢我试着用你的解决方案为一个类似的问题创建一个逐步的答案:嘿!我真的是一个新构建laravel应用程序的人,我正在处理一个类似的场景,但我对如何覆盖“retrieveByCredentials”和“validateCredentials”感到困惑,在这些方法中,我是否应该对身份验证路由进行API调用,并根据API的Json响应构建用户模型?提前谢谢@JuniorSilva很乐意帮忙。你为什么不把这当作一个问题问,这样我就可以在那里回答你?@Bul Ikana,我刚刚问了一个问题,如果你能帮我一个忙,我会很高兴的!提前谢谢!你能不能提供一个“要点”或“博客文章”的链接,告诉我们如何正确地使用这种方法。没有更多内容了。你被困在哪里?1.创建扩展EloquentUserProvider2的自定义类。通过调用auth::setProvider.注册要用作身份验证提供程序的用户提供程序。。
Auth::provider('eloquent', function($app, array $config)
{
  return new class($app['hash'], $config['model']) extends \Illuminate\Auth\EloquentUserProvider
  {

  };
});
/**
 * Get the password reset credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)
{
    return $request->only(
        'password',
        'password_confirmation',
        'token',
        'ID_Contact'
    );
}
public function boot()
    {
        $this->registerPolicies();

        Auth::provider('eloquent', function($app, array $config) {
            return new class ($app['hash'], $config['model']) extends EloquentUserProvider {

                public function retrieveById($identifier)
                {
                    $model = $this->createModel();

                    $condition = [$model->getAuthIdentifierName() => $identifier];


                    if ($model instanceof User) {
                        $condition['custom_more_filed'] = 1;
                    }

                    return $model->newQuery()
                                 ->where($condition)
                                 ->first();
                }
            };
        });
    }