2017-07-11 12 views
3

私はLaravel 5.4アプリケーションを使用しています。これは外部APIから管理ユーザーを認証する必要があります。ログインするとユーザー情報を含むJSONが返されます。カスタムユーザープロバイダーをLaravel 5.4に追加する方法

私はこれにするために、カスタムガードを作成しています:

'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に接続するために、いくつかの機能を上書きします)
<?php 

namespace App\Providers; 

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

class CustomUserProvider extends EloquentUserProvider { 

} 

を私はthe one from George Buckinghamのようないくつかのチュートリアルを読んで、私は、カスタム・ユーザー・プロバイダを作成しましたApp \プロバイダ\ 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で閉鎖中のparamsを変更した場合、私は次のエラーを取得:

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

をこれは私が、私は物事致しておりませんと思わせます正しい方法。

誰かが正しい方向に私を置くことができますか?

ありがとうございました。

答えて

2

解決策は単純でした。

まず、他のチュートリアルで述べたことにもかかわらず、CustomUserProviderを設定プロバイダに登録する必要はありません(ここではLaravel 5.4)。これが私が得たエラーの原因でした。

私だけEloquentUserProviderからの二つの方法、あなたは提供された資格情報に基づいてモデルを返すretrieveByCredentials(array $credentials)を上書きしなければならなかった、とあなたは資格情報が正しいwheterに応じてブール値を返しますvalidateCredentials(UserContract $user, array $credentials)

多くのプロバイダーでこのカスタムプロバイダークラスを使用できます。

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

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

その後、プロバイダとの認証を確認する必要がある場合は、プロバイダをガードとして提供する必要があります。 Auth::guard('customusers')

+0

ありがとうございました!私はあなたのソリューションで同様の問題のための段階的な答えを作成しようとしました:https://stackoverflow.com/a/46224576/2056125 – Pengxer

+0

ちょっと、ちょっと!私はまったく新しいlaravelアプリケーションを構築していますが、同様のシナリオで作業していますが、これらのメソッドでは「retrieveByCredentials」と「validateCredentials」をオーバーライドする方法が混乱しています。 APIのJsonレスポンスからユーザーモデルを構築しますか?前もって感謝します! –

+0

@JuniorSilvaお寄せいただきありがとうございます。私はそこに答えられるように質問してみませんか? –

0

私が見つけた解決策のどれも私のためにはうまくいきませんでしたので、私は非常に簡単な方法を考え出しました。 (Laravel 5.4

私の問題は、ユーザーが自分の電話番号でもログインできるようにしなければならないということでした。

私はEloquentUserProviderをオーバーライドします、あなたも、いくつかの条件に基づいて、ログインコントローラでプロバイダを設定することができます

Auth::setProvider(new PhoneUserProvider(app(Hasher::class), UserModel::class));

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ブートMethodeの中に、私はこれらの行を追加しました

関連する問題