Symfony 命令 - 令牌存储不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙

Posted

技术标签:

【中文标题】Symfony 命令 - 令牌存储不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙【英文标题】:Symfony command - The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL 【发布时间】:2021-04-25 22:32:37 【问题描述】:

使用Symfony5 我创建了一个命令来执行我触发的某个任务:

docker-compose exec container bin/console app:do-smthg

现在,当触发此任务时,它将进入数据库并修改一个字段,因此不会对该实体的每个实例重复该操作。

但我不能persist/flush对象原因:

The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL

我已经对此进行了一些研究,这可能是因为防火墙在启动此命令时使用了isGranted() 方法。

Dependencies:

    protected static string $commandName = 'app:do-smthg';
    private EntityManagerInterface $em;

    public function __construct(
        EntityManagerInterface $em,
        string $name = 'app:send-sms'
    )
    
        parent::__construct($name);
        $this->em = $em;
    

Actual method:

    public function execute(InputInterface $input, OutputInterface $output)
    
        $instance = $this->instanceRepository->findOneBy(['somefield' => somevalue]);

        if ($entity->getField() == false) 
            // I do something here 
          
            // then I set a field and persist 
            $instance->setField(true);
            $this->em->persist($instance);
            $this->em->flush();
        

        return Command::SUCCESS;
    

没有首先触发此错误消息的persist()flush() 方法,该命令可以正常工作。

有没有人知道我在执行这个命令时如何绕过防火墙调用isGranted() 方法?

或者是否已经存在任何其他类型的解决方法?

编辑:

我的应用程序正在使用 JWT

【问题讨论】:

那么你为什么要在你的命令中注入 Security 对象呢?防火墙的东西适用于 HTTP 请求。我从未见过它在控制台命令中发挥作用。 我已经更新了这个问题。在这种情况下,安全组件与 rl 无关,只是试图从这一点获得更多洞察力。 你是直接执行这个控制台命令吗?在这个过程中的任何地方都没有任何网络请求?也许您在某处有一个正在检查权限的学说持久/刷新事件侦听器? 我在preUpdate() / postUpdate() 上有一个该实体的监听器触发了这个问题,非常感谢!如果你想让它成为一个完整的答案,我会把它标记为解决它的人 【参考方案1】:

通常防火墙和相关的安全内容只适用于 HTTP 请求。控制台命令本身没有用户和权限。所以令人费解的是,一个简单的实体更新显然会触发 isGranted。

作为一种猜测,我建议调查 Doctrine 事件。他们可能正在检查权限。事实证明,我猜对了。我猜这个答案的“价值”在于,进去的往往比看到的要多。

【讨论】:

同样,我在 Doctrine onFlush 监听器中有 $this->authorizationChecker->isGranted('something') 。那不是一个好主意。通过删除它解决了问题。

以上是关于Symfony 命令 - 令牌存储不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 在哪里存储和获取不记名令牌并做出反应?

Symfony:身份验证请求失败:无效的 CSRF 令牌

Symfony2:记住我身份验证时无效的 CSRF 令牌

登录奏鸣曲系统用户

Symfony 2中的kernel.request事件中的身份验证令牌始终为空?

从 Symfony3 中经过身份验证的用户 (HWIOAuth) 获取 Angular2 中的 JWT 令牌