扩展Laravel 5.2 SessionGuard

时间:2016-03-18 14:33:58

标签: php laravel authentication laravel-5.2

我希望扩展Laravel库存身份验证,以便在利用现有功能的同时使用OAuth服务器进行用户检索和身份验证。我已经设法扩展EloquentUserProvider以部分覆盖/扩展Illuminate\Contracts\Auth\UserProvider合同的实现。目前的实现如下:

class EloquentOauthServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return HcOAuthProvider;
     */
    public function boot()
    {
        Auth::provider('oauth',function($app){
            $model = $app['config']['auth.providers.oauth.model'];
            $repository = new OauthUserRepository();
            return new EloquentOauthUserProvider($app['hash'], $model, $repository);
        });
    }

}

auth.php配置中,我改变了这样的描述符:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'oauth',
    ],
]

'providers' => [
    'oauth' => [
        'driver' => 'oauth',
        'model' => App\Models\User::class,
    ],
]

到目前为止,我可以覆盖方法来添加我的逻辑。但我意识到我还需要覆盖SessionGuard类(loginlogout的某些方法是特定的)因为我想使用Laravel会话实现保存和检索特定于OAuth的标记。有几个建议,但他们要么不工作(也许他们在Laravel 5.2之前工作)或者需要覆盖Authmanager,这看起来有点矫枉过正。

所以我的问题是:我在Laravel 5.2中要做什么来覆盖SessionGuard?

1 个答案:

答案 0 :(得分:5)

最近我遇到了同样的问题,所以也许解决方案是这样的。

<?php
namespace App\CoreExtensions;
use Illuminate\Auth\SessionGuard;
use Illuminate\Contracts\Auth\Authenticatable;
class SessionGuardExtended extends SessionGuard
{
    /**
     * Log a user into the application.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  bool  $remember
     * @return void
     */
    public function login(Authenticatable $user, $remember = false)
    {
        $this->updateSession($user->getAuthIdentifier());
        if ($remember) {
            $this->refreshRememberToken($user);
            $this->queueRecallerCookie($user);
        }
        $this->fireLoginEvent($user, $remember);
        $this->setUser($user);
    }
}

在AppServiceProvider.php中

public function boot()
{
    Auth::extend(
        'sessionExtended',
        function ($app) {
            $provider = new EloquentUserProvider($app['hash'], config('auth.providers.users.model'));
            return new SessionGuardExtended('sessionExtended', $provider, app()->make('session.store'), request());
        }
    );
}

在Config / auth.php中,驱动程序应重命名为

'web' => [
    'driver' => 'sessionExtended',
    'provider' => 'users',
],