#php #symfony-3.4
#php #symfony-3.4
Вопрос:
Я хочу получить пользователя внутри службы профилей, но используя TokenStorage и SecurityContext, пользователь будет каждый раз null.
это мои сервисы.yml-файл:
project.service.profiler:
class: ProjectServiceProfiler
arguments:
- "@security.helper"
- "@=service('doctrine').getRepository('bundle:ProfileKey')"
- "@=service('doctrine').getRepository('bundle:ProfileKeyUsers')"
- "@=service('doctrine').getRepository('bundle:ProfileKeyRoles')"
- "@logger"
- "@security.token_storage"
- "@security.authorization_checker"
- "@fos_oauth_server.access_token_manager.default"
и это мой профилировщик классов
class Profiler
{
public function __construct(
Security $security,
ProfileKeyRepositoryInterface $profileKeyRepository,
ProfileKeyUserRepositoryInterface $profileKeyUserRepository,
ProfileKeyRoleRepositoryInterface $profileKeyRoleRepository,
$logger,
$tokenStorage,
$authChecker,
TokenManagerInterface $tokenManager
){
if ($tokenStorage amp;amp; $tokenStorage->getToken() amp;amp; $tokenStorage->getToken()->getUser()) {
$this->user = $tokenStorage->getToken()->getUser();
}
}
}
Проблема в том, что TokenStorage-> getToken всегда имеет значение null (я уверен, я вошел в систему!).
Итак, этот профилировщик был вызван с контроллера, где присутствует пользователь, тогда я подозреваю, что когда профилировщик был вызван во время процесса загрузки symfony, пользователь еще не создан.
наконец, если я установлю эту строку кода:
$security->isGranted('IS_AUTHETICATED_FULLY'); --> thrown an Exception
или метод getToken:
$security->getToken() --> return null
Я получаю каждый раз эту ошибку:
Почему такое поведение? В предыдущей версии symfony (я имею в виду 3.3) эта проблема никогда не возникала.
Большое спасибо всем, кто мне помогает
Обновление 04.08.2019
Следуя документам symfony3.2 (https://symfony.com/blog/new-in-symfony-3-2-firewall-config-class-and-profiler), в этом сообщении говорится, чтобы проверить, находится ли запрос под брандмауэром, в противном случае пользовательский токен должен быть нулевым.
Но, в моем случае, я проверил с помощью debug toolbar, что все в порядке.
Наконец, я абсолютно понятия не имею, почему пользовательский токен равен null в моем сервисе
Вот мой раздел брандмауэра безопасности:
security:
restricted_area:
anonymous: ~
access_denied_url: /unauthorized
access_denied_handler: app.security.access_denied_handler
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
logout:
path: /logout
target: /
Комментарии:
1. Вы проверили написание константы?
IS_AUTHENTICATED_ANONYMOUSLY
2. Конечно, это был всего лишь тест для проверки других констант.
Ответ №1:
Наконец-то я сам нашел ответ!!
Итак, проблема была в коде моего класса внутри класса service: я пытался получить пользователя непосредственно в конструкторе (в потоке symfony сервисы загружаются перед управлением токенами), и здесь TokenStorage-> getToken всегда был нулевым. Итак, когда мне нужно получить пользователя внутри служебных процедур, TokenStorage-> getToken() возвращает правильное значение.
Надеюсь, что этот ответ может помочь кому-то с моей такой же (старой) проблемой.