Laravel 5 Внедрение нескольких драйверов Auth

конспект

Я строю систему с по меньшей мере двумя уровнями аутентификации, и у обоих есть отдельные модели пользователей и таблицы в базе данных. Быстрый поиск по Google и единственное решение на сегодняшний день – это пакет MultiAuth, который поддерживает несколько драйверов в Auth .

Моя цель

Я пытаюсь удалить Auth что довольно прямолинейно. Но я бы хотел, чтобы CustomerAuth и AdminAuth использовали отдельный файл конфигурации в соответствии с config/customerauth.php и config\adminauth.php

Решение

Я предполагаю, что у вас есть пакет для работы. Пространство имен наших поставщиков в этом примере будет просто: Example – все фрагменты кода можно найти в соответствии с инструкциями.

Я скопировал config/auth.php в config/customerauth.php и соответствующим образом изменил настройки.

Я отредактировал config/app.php и заменил Illuminate\Auth\AuthServiceProvider на Example\Auth\CustomerAuthServiceProvider .

Я отредактировал config/app.php и заменил псевдоним Auth :

 'CustomerAuth' => 'Example\Support\Facades\CustomerAuth', 

Затем я реализовал код внутри пакета, например, vendor/example/src/ . Я начал с ServiceProvider: Example/Auth/CustomerAuthServiceProvider.php

 <?php namespace Example\Auth; use Illuminate\Auth\AuthServiceProvider; use Example\Auth\CustomerAuthManager; use Example\Auth\SiteGuard; class CustomerAuthServiceProvider extends AuthServiceProvider { public function register() { $this->app->alias('customerauth', 'Example\Auth\CustomerAuthManager'); $this->app->alias('customerauth.driver', 'Example\Auth\SiteGuard'); $this->app->alias('customerauth.driver', 'Example\Contracts\Auth\SiteGuard'); parent::register(); } protected function registerAuthenticator() { $this->app->singleton('customerauth', function ($app) { $app['customerauth.loaded'] = true; return new CustomerAuthManager($app); }); $this->app->singleton('customerauth.driver', function ($app) { return $app['customerauth']->driver(); }); } protected function registerUserResolver() { $this->app->bind('Illuminate\Contracts\Auth\Authenticatable', function ($app) { return $app['customerauth']->user(); }); } protected function registerRequestRebindHandler() { $this->app->rebinding('request', function ($app, $request) { $request->setUserResolver(function() use ($app) { return $app['customerauth']->user(); }); }); } } 

Затем я реализовал: Example/Auth/CustomerAuthManager.php

 <?php namespace Example\Auth; use Illuminate\Auth\AuthManager; use Illuminate\Auth\EloquentUserProvider; use Example\Auth\SiteGuard as Guard; class CustomerAuthManager extends AuthManager { protected function callCustomCreator($driver) { $custom = parent::callCustomCreator($driver); if ($custom instanceof Guard) return $custom; return new Guard($custom, $this->app['session.store']); } public function createDatabaseDriver() { $provider = $this->createDatabaseProvider(); return new Guard($provider, $this->app['session.store']); } protected function createDatabaseProvider() { $connection = $this->app['db']->connection(); $table = $this->app['config']['customerauth.table']; return new DatabaseUserProvider($connection, $this->app['hash'], $table); } public function createEloquentDriver() { $provider = $this->createEloquentProvider(); return new Guard($provider, $this->app['session.store']); } protected function createEloquentProvider() { $model = $this->app['config']['customerauth.model']; return new EloquentUserProvider($this->app['hash'], $model); } public function getDefaultDriver() { return $this->app['config']['customerauth.driver']; } public function setDefaultDriver($name) { $this->app['config']['customerauth.driver'] = $name; } } 

Затем я Example/Auth/SiteGuard.php (обратите внимание, что реализованные методы имеют дополнительный сайт_, это должно быть другим для других драйверов Auth):

 <?php namespace Example\Auth; use Illuminate\Auth\Guard; class SiteGuard extends Guard { public function getName() { return 'login_site_'.md5(get_class($this)); } public function getRecallerName() { return 'remember_site_'.md5(get_class($this)); } } 

Затем я Example/Contracts/Auth/SiteGuard.php

 use Illuminate\Contracts\Auth\Guard; interface SiteGuard extends Guard {} 

Наконец я реализовал Фасад; Example/Support/Facades/Auth/CustomerAuth.php

 <?php namespace Example\Support\Facades; class CustomerAuth extends Facade { protected static function getFacadeAccessor() { return 'customerauth'; } } 

Быстрое обновление при попытке использования этих настраиваемых драйверов auth с phpunit вы можете получить следующую ошибку:

 Driver [CustomerAuth] not supported. 

Вам также необходимо реализовать это, самое простое решение – переопределить метод be а также создать trait с ним:

 <?php namespace Example\Vendor\Testing; use Illuminate\Contracts\Auth\Authenticatable as UserContract; trait ApplicationTrait { public function be(UserContract $user, $driver = null) { $this->app['customerauth']->driver($driver)->setUser($user); } }