Хранилище токенов не содержит токена аутентификации и denyAccessUnlessGranted()

У меня ошибка:

"Хранилище токенов не содержит токена аутентификации. Одной из возможных причин может быть то, что для этого 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}"

1 ответ

Решение

Почему вам нужно использовать безопасность false в тестовой среде. Если вы сделаете это и используете denyAccessUnlessGranted() в своем приложении, вы получите упомянутый вами результат. Чтобы это исправить, вы должны использовать попытку поймать ведьму, у вас есть 2 варианта, ни один из которых не является хорошим.

denyAccessUnlessGranted trows 2 типа o исключений, которые вы должны поймать

  • \ LogicException
  • AuthenticationCredentialsNotFoundException

И это два варианта, которые я упомянул

  1. Вы подавляете исключения и запускаете сценарий, так как ничего не произошло. Если вы сделаете это, вы не будете тестировать конфигурацию безопасности вашего приложения, и, что еще хуже, если вы возьмете этот код, который подавляет исключения в вашу производственную среду, из-за некоторой ошибки производственной конфигурации вы можете оставить защищенные области незащищенными.

  2. Вы бросаете AccessDeniedException, когда вы ловите эти исключения. Это предотвратит доступ к областям в случае плохой конфигурации в производственной среде вашего приложения, но это сделает эти части приложения недоступными в тестовой среде, и я не думаю, что вы этого хотите.

Компонент безопасности приложения является такой же частью ваших приложений, как и любая другая бизнес-функция. Он должен быть активен в любой среде и настроен одинаково. Единственная разница между вашей средой тестирования, разработки или разработки должна заключаться в файле параметров (например, где хранятся пользователи).

Надеюсь, это поможет, Александру Косой

Другие вопросы по тегам