个性化阅读
专注于IT技术分析

如何使用FOSOAuthServerBundle从数据库中清除所有过期的令牌

如你所知, 每次执行对应用程序/ oauth路由的请求(已实现FOSOAuthServerBundle)时, 你都将在数据库中的access_token表中注册一个令牌(或根据auth_code表中请求的grant_type参数) )。

在他们的头脑中, 开发人员不希望数据库中有无用的记录, 因此我们需要从过期的oauth令牌中清除数据库。有两种方法可以从数据库中清除令牌:执行捆绑软件的clean命令或复制相同的逻辑, 然后直接从控制器(或服务)中执行。

FOSOAuthServer捆绑软件已经实现了清洁命令, 可以为你解决问题。只需从命令行执行以下命令:

$ php app/console fos:oauth-server:clean

你将得到类似于以下内容的输出:

FOSOauthServerBundle

你也可以使用与命令相同的方式, 从symfony控制器清除所有过期的令牌。检索服务, 并按以下方式访问deleteExpired函数:

<?php

namespace myapp\myBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class AdminController extends Controller
{
    public function cleartokensAction(){
        $services = array(
            'fos_oauth_server.access_token_manager'  => 'Access token', 'fos_oauth_server.refresh_token_manager' => 'Refresh token', 'fos_oauth_server.auth_code_manager'     => 'Auth code', );

        $info = array();

        foreach ($services as $service => $name) {
            /** @var $instance TokenManagerInterface */

            // if you're not from a controller, you need to inject the container and the use the get option
            $instance = $this->get($service);
            if ($instance instanceof TokenManagerInterface || $instance instanceof AuthCodeManagerInterface) {
                $result = $instance->deleteExpired();
                array_push($info, array(
                  'serviceName' => $name,                   'numberDeletedTokens' => $result
                ));
            }
        }

        var_dump($info);
        // dump an array with the same structure as the shown in the first image.


        // handle the response by yourself, otherwise this will throw error.
    }
}

当然, 你需要保护此功能, 以防止没有适当权限(无管理员)的用户无法使用此功能。

如果要自动执行此任务, 则可以在操作系统中创建crontab, 以在需要时执行命令(或在控制器中提供代码的php文件)。玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何使用FOSOAuthServerBundle从数据库中清除所有过期的令牌

评论 抢沙发

评论前必须登录!