1

我有一个错误:

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

这是由denyAccessUnlessGranted()添加到控制器引起的。它发生在测试环境中security: false。在这种情况下是否有处理环境的机制或者我应该如何处理它?

痕迹:

0 /backend/vendor/symfony/framework-bundle/Controller/ControllerTrait.php(179): Symfony\Component\Security\Core\Authorization\AuthorizationChecker->isGranted('read', Object(App\Entity\Company))
1 /backend/vendor/symfony/framework-bundle/Controller/ControllerTrait.php(192): Symfony\Bundle\FrameworkBundle\Controller\AbstractController->isGranted('read', Object(App\Entity\Company))
2 /backend/src/Controller/CompanyController.php(125): Symfony\Bundle\FrameworkBundle\Controller\AbstractController->denyAccessUnlessGranted('read', Object(App\Entity\Company))
3 /backend/vendor/symfony/http-kernel/HttpKernel.php(150): App\Controller\CompanyController->cget(Object(Symfony\Component\HttpFoundation\Request), Object(App\Service\CompanyService))
4 /backend/vendor/symfony/http-kernel/HttpKernel.php(67): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
5 /backend/vendor/symfony/http-kernel/Kernel.php(198): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
6 /backend/public/index.php(37): Symfony\Component\HttpKernel\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request))
7 {main}"
4

1 回答 1

2

为什么需要在测试环境中使用security false。如果您这样做并在应用程序中使用 denyAccessUnlessGranted() ,您将获得您提到的结果。要解决此问题,您必须使用 try catch 女巫给您留下 2 个选项,但它们都不是一个好的选项。

denyAccessUnlessGranted 包含 2 种您需要捕获的异常

  • \逻辑异常
  • AuthenticationCredentialsNotFoundException

这是我提到的两个选项

  1. 您抑制异常并让脚本运行,因为没有发生任何事情。如果您这样做,您将不会测试您的应用程序安全配置,更糟糕的是,如果您将此抑制异常的代码带入您的生产环境,一些生产配置错误可能会使您的安全区域不受保护。

  2. 捕获此异常时会抛出 AccessDeniedException。如果您的应用程序的生产环境中配置错误,这将阻止访问区域,但是这样做会使应用程序的这一部分在测试环境中无法访问,我认为您不希望这样。

应用程序的安全组件与其他所有业务功能一样是应用程序的一部分。它应该在每个环境中都处于活动状态并且配置相同。您的测试、开发或生产环境之间的唯一区别应该在参数文件中(例如用户存储在哪里)。

希望这会有所帮助, Alexandru Cosoi

于 2019-02-06T13:22:42.560 回答