我有一个 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/