Laravel5使用Passport密码授权单用户登录的方法

Laravel使用Passport密码授权 时,默认同一个账号是可以同时在多个地方登录的,这样数据库中同一个账号会产生多个AccessTokenRefreshToken,现在我们要实现的就是当一个账号登录时,清除掉它之前在其他地方登录时生成的AccessTokenRefreshToken

Passport密码授权 有两个事件,一个是AccessTokenCreated,一个是RefreshTokenCreated,这里我们监听第一个事件就可以了。

配置监听项

app/Providers/EventServiceProvider中增加监听项:

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
	'Laravel\Passport\Events\AccessTokenCreated' => [
		'App\Listeners\Auth\RevokeOldTokens',
	],
];

生成监听器

php artisan event:generate

增加监听代码

执行命令后目录App\Listeners\Auth\下会生成监听文件RevokeOldTokens.php,修改handle函数如下:

/**
     * Handle the event.
     *
     * @param  AccessTokenCreated  $event
     * @return void
     */
    public function handle(AccessTokenCreated $event)
    {
        $tokenIdArr = Token::where('id', '!=', $event->tokenId)
            ->where('user_id', $event->userId)
            ->pluck('id')->toArray();
        DB::table('oauth_refresh_tokens')->whereIn('access_token_id', $tokenIdArr)
            ->delete();
        Token::where('id', '!=', $event->tokenId)
            ->where('user_id', $event->userId)
            ->delete();
    }

至此,用户通过接口授权时,会自动清掉之前生成过的全部AccessTokenRefreshToken

Laravel Laravel

Redis命令-Key