不是如何制作自定义auth驱动程序。最终需要SOAP。

时间:2015-10-20 14:49:58

标签: php authentication laravel-5.1

我对Laravel很新,我真的需要一些帮助。我需要为我的工作创建一个简单的应用程序,我认为我不会有这个问题,因为这里的教程非常好。

我遇到的问题是,对于该项目,我需要使用SOAP Web服务对外部数据库验证用户,如果用户不存在于本地数据库中,我创建它并将用户登录。我能够管理这部分,因为我已经编写了一个Joomla插件来实现这一点。

我试图找出有关如何创建自定义驱动程序的文档。 http://laravel.com/docs/5.1/authentication我认为起初我会复制EloquentUserProvider以修改它,因此我创建了:

ErsAuthServiceProviderErsUserProvider分别位于App\ProvidersApp\Extensions

但它神秘地不起作用......我收到以下错误:

ErrorException in ErsUserProvider.php line 33: Argument 1 passed to App\Extensions\ErsUserProvider::__construct() must be an instance of Illuminate\Contracts\Hashing\Hasher, none given, called in /home/vagrant/Code/ERSTools/app/Providers/ErsAuthServiceProvider.php on line 31 and defined

实际上我在文档中并不太了解他们在示例中使用boot()方法做了什么。我知道他们扩展了Auth类以添加新的驱动程序(在我的情况下是ers),但我不明白为什么他们通过了$app['riak.connection']

<?php

namespace App\Providers;

use Auth;
use App\Extensions\ErsUserProvider;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

    class ErsAuthServiceProvider extends ServiceProvider

    {

        protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];


    /**
     * Register any application authentication / authorization services.
     *
     * @param  \Illuminate\Contracts\Auth\Access\Gate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        parent::registerPolicies($gate);

         Auth::extend('ers', function($app) {
            // Return an instance of Illuminate\Contracts\Auth\UserProvider...
            return new ErsUserProvider;
        });

        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

<?php

namespace App\Extensions;

use Illuminate\Support\Str;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;

class ErsUserProvider implements UserProvider
{
   /**
     * The hasher implementation.
     *
     * @var \Illuminate\Contracts\Hashing\Hasher
     */
    protected $hasher;

    /**
     * The Eloquent user model.
     *
     * @var string
     */
    protected $model;

    /**
     * Create a new database user provider.
     *
     * @param  \Illuminate\Contracts\Hashing\Hasher  $hasher
     * @param  string  $model
     * @return void
     */
    public function __construct(HasherContract $hasher, $model)
    {
        $this->model = $model;
        $this->hasher = $hasher;
    }
... the rest is similar to the original file (EloquentUserProvider)

最后,我的计划是让ErsUserproviderEloquentUserProvider非常相似,并使用validateCredentials()方法中的网络服务实施我的检查,因为在这种方法中我应该知道用户在本地数据库中存在请求的用户名,我将知道用户是否通过SOAP webservice验证,然后我可以

  1. 登录用户
  2. 登录用户并根据webservice
  3. 返回的日期创建新用户
  4. 拒绝登录。
  5. 这是一个好计划吗?

1 个答案:

答案 0 :(得分:0)

我出汗了,但我做了第一部分工作。问题出在boot方法中。我的自定义提供程序是原始laravel 5.1的工作副本。我现在可以自定义它。

以下是有效的服务提供商:

<?php

namespace App\Providers;

use App\Extensions\ErsUserProvider;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Auth\UserProvider;

class ErsAuthServiceProvider extends ServiceProvider

{
 /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

        $this->app['auth']->extend('ers',function($app)
        {
            $model = $app['config']['auth.model'];
            return new ErsUserProvider($app['hash'], $model);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}