ash*_*ash 7 php authentication reflection laravel-5
我正在构建一个至少具有两级身份验证的系统,并且在数据库中都有单独的用户模型和表.谷歌的快速搜索和迄今为止唯一的解决方案是使用MultiAuth软件包,可以驱动多个驱动程序Auth.
我试图删除Auth哪个是相当直截了当的.不过,我想CustomerAuth和AdminAuth使用单独的配置文件按config/customerauth.php和config\adminauth.php
ash*_*ash 16
我假设你有一个可以使用的包.此示例中的供应商名称空间只是: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',
Run Code Online (Sandbox Code Playgroud)
然后我在包中实现了代码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();
});
});
}
}
Run Code Online (Sandbox Code Playgroud)
然后我实施了: 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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我实现了Example/Auth/SiteGuard.php(注意实现的方法有一个额外的site_定义,这应该与其他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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我实施了 Example/Contracts/Auth/SiteGuard.php
use Illuminate\Contracts\Auth\Guard;
interface SiteGuard extends Guard {}
Run Code Online (Sandbox Code Playgroud)
最后我实施了Facade; Example/Support/Facades/Auth/CustomerAuth.php
<?php namespace Example\Support\Facades;
class CustomerAuth extends Facade
{
protected static function getFacadeAccessor()
{
return 'customerauth';
}
}
Run Code Online (Sandbox Code Playgroud)
快速更新,当尝试使用phpunit使用这些自定义auth驱动程序时,您可能会收到以下错误:
Driver [CustomerAuth] not supported.
Run Code Online (Sandbox Code Playgroud)
您还需要实现这一点,最简单的解决方案是覆盖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);
}
}
Run Code Online (Sandbox Code Playgroud)