2016-06-01 192 views
1

我試圖在laravel 5.2中實現多重身份驗證。我下面this articleLaravel- Multiauth不在Laravel 5.2中工作

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

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, 

    ], 

]; 

當我跑這個項目,我看到的錯誤

致電未定義的方法Illuminat Ë\基金會\應用:: bindShared() 在MultiauthServiceProvider.php線13

我改變了MultiAuthServiceProvider.php

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

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

,現在我看到這個錯誤作爲附加的截圖 enter image description here 我不知道什麼是嘗試實例化Gate Facade

回答

1

而不是像這樣創建一個自定義的多重驗證,我建議您使用Laravel自定義驗證guard和auth provider。老實說,第二種方法還沒有測試,但我認爲它應該起作用。

1。一個模型中的多個守衛

在您config/auth.php添加一個新的組織後衛:

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

然後使用組auth:admin,當然你還必須建立另一箇中間件,可以檢查你的路由無論當前用戶是否爲管理員用戶。要獲得通過身份驗證的用戶實例,您需要指定自定義警衛:Auth::guard('admin')->user()

爲了確保它的工作,創建兩個路徑一個組auth中間件和一個與auth:admin中間件,當你登錄的用戶對使用auth:admin嘗試訪問您應該被要求重新登錄其他途徑組路線。

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.多個型號

出現在您的config/auth.php,創建新的自定義提供商:

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

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

然後用admins創建自定義的後衛作爲供應商:

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

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

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

使用t他的方法你不需要創建自定義中間件,使用auth:admin應該沒問題。

+0

我嘗試了'Laravel'的方式,在這個答案中解釋http:// stackoverflow。com/questions/34614753/can-anyone-explain-laravel-5-2-multi-auth-with-example但是它僅在用戶表中註冊我 – baig772

+0

你的意思是當你註冊'Admin'用戶時它會轉到'users'表?如果是這樣,那麼你必須在'AuthController'的'create()'方法上仍然使用'User'模型。 – Rifki

+0

同樣在你的AuthController上進行管理授權,你必須通過添加這個屬性來指定自定義警衛'protected $ guard ='admin';' – Rifki