2016-06-01 188 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