2016-06-01 26 views
1

Ich versuche, Multi-Authentifizierung in laravel 5.2 zu implementieren. Ich folge this articleLaravel- Multiauth funktioniert nicht in Laravel 5.2

Mein Auth.php

<?php 

return [ 
'multi' => array(
    'user' => array(
    'driver' => 'eloquent', 
    'model' => 'App\User', 
    'table' => 'users', 
    ), 
    'admin' => array(
    'driver' => 'database', 
    'model' => 'App\Admin', 
    'table' => 'tbl_admin_user', 
    ) 
), 
'password' => [ 
'email' => 'emails.password', 
'table' => 'password_resets', 
'expire' => 60, 
], 
]; 

Mein App.php

'providers' => [ 

     /* 
     * Laravel Framework Service Providers... 
     */ 
     //Illuminate\Auth\AuthServiceProvider::class, 
     Ollieread\Multiauth\MultiauthServiceProvider::class, 
     Illuminate\Broadcasting\BroadcastServiceProvider::class, 
     Illuminate\Bus\BusServiceProvider::class, 
     Illuminate\Cache\CacheServiceProvider::class, 
     Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, 
     Illuminate\Cookie\CookieServiceProvider::class, 
     Illuminate\Database\DatabaseServiceProvider::class, 
     Illuminate\Encryption\EncryptionServiceProvider::class, 
     Illuminate\Filesystem\FilesystemServiceProvider::class, 
     Illuminate\Foundation\Providers\FoundationServiceProvider::class, 
     Illuminate\Hashing\HashServiceProvider::class, 
     Illuminate\Mail\MailServiceProvider::class, 
     Illuminate\Pagination\PaginationServiceProvider::class, 
     Illuminate\Pipeline\PipelineServiceProvider::class, 
     Illuminate\Queue\QueueServiceProvider::class, 
     Illuminate\Redis\RedisServiceProvider::class, 
     Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, 
     Illuminate\Session\SessionServiceProvider::class, 
     Illuminate\Translation\TranslationServiceProvider::class, 
     Illuminate\Validation\ValidationServiceProvider::class, 
     Illuminate\View\ViewServiceProvider::class, 

     /* 
     * Application Service Providers... 
     */ 
     App\Providers\AppServiceProvider::class, 
     App\Providers\AuthServiceProvider::class, 
     App\Providers\EventServiceProvider::class, 
     App\Providers\RouteServiceProvider::class, 

    ], 

    /* 
    |-------------------------------------------------------------------------- 
    | Class Aliases 
    |-------------------------------------------------------------------------- 
    | 
    | This array of class aliases will be registered when this application 
    | is started. However, feel free to register as many as you wish as 
    | the aliases are "lazy" loaded so they don't hinder performance. 
    | 
    */ 

    'aliases' => [ 

     'App' => Illuminate\Support\Facades\App::class, 
     'Artisan' => Illuminate\Support\Facades\Artisan::class, 
     'Auth' => Illuminate\Support\Facades\Auth::class, 
     'Blade' => Illuminate\Support\Facades\Blade::class, 
     'Cache' => Illuminate\Support\Facades\Cache::class, 
     'Config' => Illuminate\Support\Facades\Config::class, 
     'Cookie' => Illuminate\Support\Facades\Cookie::class, 
     'Crypt' => Illuminate\Support\Facades\Crypt::class, 
     'DB' => Illuminate\Support\Facades\DB::class, 
     'Eloquent' => Illuminate\Database\Eloquent\Model::class, 
     'Event' => Illuminate\Support\Facades\Event::class, 
     'File' => Illuminate\Support\Facades\File::class, 
     'Gate' => Illuminate\Support\Facades\Gate::class, 
     'Hash' => Illuminate\Support\Facades\Hash::class, 
     'Lang' => Illuminate\Support\Facades\Lang::class, 
     'Log' => Illuminate\Support\Facades\Log::class, 
     'Mail' => Illuminate\Support\Facades\Mail::class, 
     'Password' => Illuminate\Support\Facades\Password::class, 
     'Queue' => Illuminate\Support\Facades\Queue::class, 
     'Redirect' => Illuminate\Support\Facades\Redirect::class, 
     'Redis' => Illuminate\Support\Facades\Redis::class, 
     'Request' => Illuminate\Support\Facades\Request::class, 
     'Response' => Illuminate\Support\Facades\Response::class, 
     'Route' => Illuminate\Support\Facades\Route::class, 
     'Schema' => Illuminate\Support\Facades\Schema::class, 
     'Session' => Illuminate\Support\Facades\Session::class, 
     'Storage' => Illuminate\Support\Facades\Storage::class, 
     'URL' => Illuminate\Support\Facades\URL::class, 
     'Validator' => Illuminate\Support\Facades\Validator::class, 
     'View' => Illuminate\Support\Facades\View::class, 

    ], 

]; 

Als ich das Projekt lief, sah ich den Fehler

Aufruf zu undefinierter Methode Illuminat e \ Foundation \ Application :: bindShared() in MultiauthServiceProvider.php Linie 13

änderte ich die MultiAuthServiceProvider.php zu

$this->app->singleton('auth', function ($app) { 
     $app['auth.loaded'] = true; 

     return new \Ollieread\Multiauth\MultiManager($app); 
    }); 

und jetzt diesen Fehler ich sehe, wie im Screenshot beigefügt enter image description here Ich bin mir nicht sicher, was versucht, die Gate Facade

Antwort

1

zu instanziieren. Anstatt eine benutzerdefinierte multi Auth wie diese zu erstellen, empfehle ich Ihnen, Laravel benutzerdefinierte Auth 012 zu verwendenund auth provider. Ehrlich gesagt, die zweite Methode ist noch nicht getestet, aber ich denke, es sollte gearbeitet werden.

1. Ein Modell mehrere Wächter

Auf Ihrem config/auth.php eine neue Wache hinzu:

'guards' => [ 
    'web' => [ 
     'driver' => 'session', 
     'provider' => 'users', 
    ], 

    'api' => [ 
     'driver' => 'token', 
     'provider' => 'users', 
    ], 

    // new guard for admin using the same model and table. 
    'admin' => [ 
     'driver' => 'session', 
     'provider' => 'users', 
    ], 
], 

Dann gruppieren Sie Ihre Routen auth:admin mit, natürlich müssen Sie auch eine andere Middleware erstellen, überprüfen ob der aktuelle Benutzer ein Administrator ist. Um eine authentifizierte Benutzerinstanz zu erhalten, müssen Sie den benutzerdefinierten Schutz angeben: Auth::guard('admin')->user().

Um sicherzustellen, dass es funktioniert, erstellen Sie zwei Routen Gruppe eins mit auth Middleware und einem mit auth:admin Middleware, wenn Sie in Benutzern auf Routen angemeldet haben, die auth:admin Versuch verwendet die anderen Routen Gruppe zugreifen, die Sie sich wieder anmelden gebeten sollten.

Route::group(['middleware' => 'auth'], function() { 
    Route::get('/', function() { 
     return 'You are logged in using guard: web'; 
    }); 
}); 

Route::group(['middleware' => 'auth:admin'], function() { 
    Route::get('/admin', function() { 
     return 'You are logged in using guard: admin'; 
    }); 
}); 

2. Mehrere Modelle

Wieder auf Ihrem config/auth.php, neue benutzerdefinierte Provider erstellen:

'providers' => [ 
    'users' => [ 
     'driver' => 'eloquent', 
     'model' => App\User::class, 
    ], 

    'admins' => [ 
     'driver' => 'eloquent', 
     'model' => App\Admin::class', 
    ], 
], 

Dann eine eigene Wache mit admins als Anbieter erstellen:

'guards' => [ 
    'web' => [ 
     'driver' => 'session', 
     'provider' => 'users', 
    ], 

    'api' => [ 
     'driver' => 'token', 
     'provider' => 'users', 
    ], 

    // new guard for admin using custom provider. 
    'admin' => [ 
     'driver' => 'session', 
     'provider' => 'admins', 
    ], 
], 

Verwendung von t seine Methode müssen Sie keine benutzerdefinierte Middleware erstellen, verwenden Sie auth:admin sollte in Ordnung sein.

+0

Ich versuchte den 'Laravel' Weg, wie in dieser Antwort http: // stackoverflow erklärt.com/questions/34614753/can-anyone-explain-laravel-5-2-multi-auth-mit-beispiel aber es register mich nur in benutzer tabelle – baig772

+0

meinst du, wenn du 'Admin' user registriert geht es zu' benutzer' Tabelle? Wenn ja, dann müssen Sie immer 'User' Modell auf' create() 'Methode von' AuthController' verwenden. – Rifki

+0

Auch auf Ihrem 'AuthController' für die Admin-Authentifizierung müssen Sie den benutzerdefinierten Guard angeben, indem Sie diese Eigenschaft 'protected $ guard =' ​​admin ';' hinzufügen – Rifki