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

标签 php laravel laravel-5.4

我有一个 Laravel 5.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,
    ]
],

在那之后,我不确定如何继续。我读过一些教程,例如 the one from George Buckingham ,并且我已经创建了一个自定义用户提供程序(现在我只需要它从 EloquentUserProvider 扩展,最终我将覆盖一些函数以连接到 API)

<?php

namespace App\Providers;

use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Support\Str;

class CustomUserProvider extends EloquentUserProvider { 

}

然后在 App\Providers\AuthServiceProvider 中注册它

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

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

在 config/app.php 中

'providers' => [

    // Lots of other providers

    // Own providers
    App\Providers\CustomUserProvider::class,
],

但在那之后,我得到以下错误:

Argument 1 passed to Illuminate\Auth\EloquentUserProvider::__construct() must be an instance of Illuminate\Contracts\Hashing\Hasher, instance of Illuminate\Foundation\Application given, called in /var/www/public/iberorides/vendor/laravel/framework/src/Illuminate/Foundation/Application.php on line 612 and defined

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

Argument 1 passed to Illuminate\Foundation\Application::bootProvider() must be an instance of Illuminate\Support\ServiceProvider, instance of App\Providers\IberoUserProvider given, called in /var/www/public/iberorides/vendor/laravel/framework/src/Illuminate/Foundation/Application.php on line 771 and defined

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

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

非常感谢。

最佳答案

解决方案很简单。

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

我只需要覆盖 EloquentUserProvider 中的两个方法,retrieveByCredentials(array $credentials),您可以根据提供的凭据返回一个模型,以及 validateCredentials( UserContract $user, array $credentials) 根据凭据是否正确返回 bool 值。

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

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

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

之后,当您需要向任何提供者检查身份验证时,您需要提供提供者作为守卫,例如Auth::guard('customusers')

关于php - 如何在 Laravel 5.4 中添加自定义用户提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45024429/

相关文章:

php - 在 Mac OS Lion 上使用 XAMPP 安装 MongoDb PHP 驱动程序时出错

php - MySQL "NOT IN"查询不工作

php - 在 PHP 执行时加载页面

php - Gitlab CI 配置与 Laravel Docker Redis 错误的主机或端口

php - 如何在 Laravel Blade 中创建可搜索的选择选项表单

jquery - toastr 没有出现在laravel中

php - 如何在 laravel 5.4 中保护 .env 文件?

php - AJAX 帖子 : Not able to retrieve posted data array in PHP

javascript - 很难理解 Laravel 中的重定向/路由

javascript - 为什么我的 JavaScript 没有加载到 Bootstrap 选项卡中?