Я строю систему с по меньшей мере двумя уровнями аутентификации, и у обоих есть отдельные модели пользователей и таблицы в базе данных. Быстрый поиск по 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); } }