我希望扩展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
类(login
和logout
的某些方法是特定的)因为我想使用Laravel会话实现保存和检索特定于OAuth的标记。有几个建议,但他们要么不工作(也许他们在Laravel 5.2之前工作)或者需要覆盖Authmanager
,这看起来有点矫枉过正。
所以我的问题是:我在Laravel 5.2中要做什么来覆盖SessionGuard?
答案 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',
],