如何为Laravel 5.7创建自定义身份验证保护/提供程序

如何为Laravel 5.7创建自定义身份验证保护/提供程序,laravel,Laravel,我正在从Laravel4迁移到5.7,我的自定义身份验证提供程序有问题。我关注了各种演练(例如),以及相当多的谷歌搜索 我已尝试通过以下方式实现此功能: 设置防护和提供者,并链接到我的目标模型 'defaults' => [ 'guard' => 'custom_auth_guard', 'passwords' => 'users', ], 'guards' => [ 'custom_auth_

我正在从Laravel4迁移到5.7,我的自定义身份验证提供程序有问题。我关注了各种演练(例如),以及相当多的谷歌搜索

我已尝试通过以下方式实现此功能:

设置防护和提供者,并链接到我的目标模型


    'defaults' => [
        'guard' => 'custom_auth_guard',
        'passwords' => 'users',
    ],

    'guards' => [

        'custom_auth_guard' => [
            'driver' => 'session',
            'provider' => 'custom_auth_provider',
        ],
    ],

    'providers' => [

        'custom_auth_provider' => [
            'driver' => 'custom',
            'model' => App\UserAccount::class,
        ],        
    ],
注册在上述提供程序中定义的驱动程序。为了方便起见,我正在利用AuthServiceProvider


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

        \Auth::provider('custom',function() {            
        return new App\Auth\CustomUserProvider;
        });
    }
...
创建了我的自定义提供程序,其中包含我的retrieveByCredentials等。我用一些die()替换了逻辑,以验证它是否在这里创建。在Laravel 4中,它用于转到validateCredentials()

作为参考,App/UserAccount看起来是这样的

class UserAccount extends Authenticatable
{
    use Notifiable;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'public.user_account';

    // no updated_at, created_at
    public $timestamps = false;

    private $_roles = [];
    private $_permissions = [];
}
use Illuminate\Foundation\Auth\User as Authenticatable;
class UserAccount extends Authenticatable
{
    protected $table = 'public.user_account';

    // no updated_at, created_at
    public $timestamps = false;

    private $_roles = [];
    private $_permissions = [];
}
最后,我通过我的控制器调用它

        if(\Auth::attempt($credentials){
            return \Redirect::intended('/dashboard');
        }
我也试着直接给警卫打电话

        if(\Auth::guard('custom_auth_guard')->attempt($credentials){
            return \Redirect::intended('/dashboard');
        }
这将导致以下错误:
“未定义身份验证保护[自定义身份验证保护]。

我尝试了一些其他命令以确保没有缓存问题:

composer update
php artisan cache:clear
结果:当我调用Auth::trument($credentials)时,Laravel正在尝试对users表运行查询。预期结果是,它将命中CustomUserProvider中的一个die()。。。或者至少尝试查询模型中定义的public.user\u帐户

我已经在这上面混了一段时间了,我一定错过了一些简单的东西。。。希望有人有一点更多的经验,在拉雷维尔5可以看到我做错了什么


提前谢谢

设法解决了这个问题。有两个小问题,但最主要的是我试图借助AuthServiceProvider而不是我自己的提供商。下面是我为使自定义身份验证提供程序在Laravel5.7中工作所做的工作

在config.auth.php中设置提供程序

'providers' => [

    'user' => [
        'driver' => 'eloquent',
        'model' => \UserAccount::class,
    ],        
],
在app/providers/中创建新的提供程序。这将使用正确的用户提供程序代码链接上面列出的提供程序

namespace App\Providers;

use Auth;
use App\Auth\CustomUserProvider;
use Illuminate\Support\ServiceProvider;

class CustomAuthProvider extends ServiceProvider
{

    public function register()
    {
        //
    }

    public function boot()
    {
        Auth::provider('eloquent',function()
        {
            return new CustomUserProvider(new \UserAccount());
        });
    }
}
在app/auth/中创建了我的自定义提供程序。这是验证用户的逻辑,并替换了用于auth的laravel函数。我在这里遇到了一个问题,它正在验证但没有填充用户对象。我最初做了一个测试,看看对象是否为空,如果为空,则填充。。。但是,它总是填充一个空对象。删除测试允许我调用Auth::user()函数

namespace App\Auth;

use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Auth\EloquentUserProvider;

class CustomUserProvider implements EloquentUserProvider{

    public function __construct()
    {
        $this->user = $user;
    }

    public function retrieveByID($identifier)
    {   
        $this->user = \UserAccount::find($identifier);
        return $this->user;
    }

    public function retrieveByCredentials(array $credentials)
    {
       // find user by username
        $user = \UserAccount::where('name', $credentials['username'])->first();

        // validate
        return $user;
    }

    public function validateCredentials(\Illuminate\Auth\UserInterface $user, array $credentials)
    { 
        //logic to validate user
    }
更新的应用程序/模型/用户帐户看起来是这样的

class UserAccount extends Authenticatable
{
    use Notifiable;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'public.user_account';

    // no updated_at, created_at
    public $timestamps = false;

    private $_roles = [];
    private $_permissions = [];
}
use Illuminate\Foundation\Auth\User as Authenticatable;
class UserAccount extends Authenticatable
{
    protected $table = 'public.user_account';

    // no updated_at, created_at
    public $timestamps = false;

    private $_roles = [];
    private $_permissions = [];
}
就这样。我现在可以通过下面的调用进行验证

        if(\Auth::attempt($credentials){
            return \Redirect::intended('/dashboard');
        }

你的提供者代码帮了我一点忙,但是,我一直在实现方法
validateCredentials
retrieveByCredentials
,等等。因为我是从API进行身份验证的,所以我的项目中没有任何数据库,所有的东西都在API的数据库中,根据Laravel文档,我需要返回
Authenticatable
的实现,但我不打算创建任何模型。希望我能返回任何类型的数据。。。