Пользователь null внутри сервисов с symfony 3.4.17

#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() возвращает правильное значение.

Надеюсь, что этот ответ может помочь кому-то с моей такой же (старой) проблемой.