当前位置: 首页 > 知识库问答 >
问题:

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

葛昱
2023-03-14

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

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

<?php

namespace App\Providers;

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

class CustomUserProvider extends EloquentUserProvider { 

}

然后在应用\提供商\AuthService提供商中注册

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,
],

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

传递给Illumb\Auth\EloquentUserProvider::\uuu construct()的参数1必须是Illumb\Contracts\Hashing\Hasher的实例,给定的Illumb\Foundation\Application的实例,在/var/www/public/iberorides/vendor/laravel/framework/src/Illumb/Foundation/Application中调用。第612行的php,已定义

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

传递给Illumb\Foundation\Application::bootProvider()的参数1必须是Illumb\Support\ServiceProvider的实例,给定的App\Providers\IberouseProvider的实例,在/var/www/public/iberorides/vendor/laravel/framework/src/illumb/Foundation/Application中调用。第771行上的php,已定义

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

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

非常感谢你。

共有3个答案

那博瀚
2023-03-14
匿名用户

我找到的解决方案都不适合我,所以我想出了一个超级简单的方法。(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();
    }
}

在我的引导方法中,我添加了以下几行:

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

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

狄高畅
2023-03-14

EloquentUserProvider的非常小的定制可以通过AuthServiceProvider的引导方法中的以下代码来完成。

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

  };
});
朱明知
2023-03-14

解决办法很简单。

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

我只需要从EloquentUserProvider中重写两个方法,在其中根据所提供的凭据返回模型,并且validateCreentials(用户合同$user,数组凭据)在其中根据是否返回布尔值凭据是正确的。

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

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

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

之后,当您需要检查任何提供者的身份验证时,您需要将提供者提供为守卫,例如Auth::守卫(“定制用户”)

 类似资料:
  • 我正在使用Symfony Security和系统中的自定义用户提供程序。它通过web服务为用户提供服务。 我根据本教程配置提供程序(http://symfony.com/doc/current/cookbook/security/custom_provider.html). 这里是检查用户的功能: 这很好,函数使用用户名调用一个web服务,然后返回一个包含用户数据的数组。但是现在我需要通过另一个w

  • 我使用的是Spring Boot 2.0(利用Spring Security 5.0)。我正在尝试向WebSecurityConfigureAdapter子类中的AuthenticationManager添加自定义AuthenticationProvider。如果我重写configure(AuthenticationManagerBuilder)方法来提供我的新提供者,那么我不知道如何将Authe

  • 我将为我的网站创建自定义用户提供程序,对于用户来说,没有“用户名”和“密码”这样的概念(实际上有类似于密码的东西,但它的名称不同)。在文档中,用户实体必须实现来自安全包的UserInterface,该安全包具有诸如getUsername、getPassword之类的方法。我能用我自己的领域吗?或者我应该使用名称冲突(例如,getUsername将返回我的唯一字段)来实现我的行为吗?

  • 问题内容: 我正在尝试为我的应用程序创建一个帐户,在该帐户中我可以与我的帐户建立联系,例如facebook,viber,whatsapp等。我也希望我的帐户在设置的“帐户”部分中可见。有任何想法吗?我已经在Google上搜索了很多,但是找不到正确的答案从哪里开始。请帮忙。我试图创建一个帐户如下。这导致我出错。 问题答案: 您需要设置多个组件才能以编程方式创建一个帐户。你需要: AccountAut

  • 是否有一个时间格式来指定这样的日期序列到轴在D3和v4?

  • 问题内容: Sun的PKCS11 JCE安全提供程序缺少我们需要的某些功能。 因此,我使用原始资源编写了它的增强版本。 不幸的是,JCE基础结构拒绝新的提供者 “ JCE无法验证提供者”, 因为它没有正确签名。 抛出。 (呼叫) 关于如何签署新提供商以使其与JCE一起工作的任何建议? 问题答案: 该过程在文档“如何实现 提供者”中进行了描述。 它涉及到电子邮件 太阳向Oracle提供一些信息(包括