【问题标题】:Laravel 5 Implement multiple Auth driversLaravel 5 实现多个 Auth 驱动程序
【发布时间】:2015-05-09 09:42:22
【问题描述】:

概要

我正在构建一个具有至少两个身份验证级别的系统,并且两者在数据库中都有单独的用户模型和表。在 google 上快速搜索,到目前为止唯一的解决方案是使用 MultiAuth 包,该包在 Auth 上插入多个驱动程序。

我的目标

我正在尝试删除Auth,这是相当直接的。但我希望 CustomerAuthAdminAuth 按照 config/customerauth.phpconfig\adminauth.php 使用单独的配置文件

【问题讨论】:

    标签: php authentication reflection laravel-5


    【解决方案1】:

    解决方案

    我假设您有一个可用的软件包。在此示例中,我的供应商命名空间将是:Example - 所有代码 sn-ps 都可以按照说明找到。

    我将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(注意实现的方法有一个额外的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));
        }
    }
    

    然后我实现了Example/Contracts/Auth/SiteGuard.php

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

    最后我实现了 Facade; Example/Support/Facades/Auth/CustomerAuth.php

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

    快速更新,当尝试将这些自定义身份验证驱动程序与 一起使用时,您可能会收到以下错误:

    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);
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2017-07-19
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多