Вызов функции-члена getId () для строки после входа в систему - PullRequest
0 голосов
/ 03 марта 2020

Я захожу на часть сайта, которая требует входа пользователя в систему. Но система, вместо того, чтобы войти в систему, а затем на сайт, к которому я хочу получить доступ, показывает мне ошибку, указывающую, что я не вошли в систему.

Код контроллера выглядит следующим образом:

/**
* @Route("/estrategia/titulares", name="estrategia_titulares")
*/
    public function estrategiaTitularesAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $logged = $this->get('security.token_storage')->getToken()->getUser();
        $user = $em->getRepository('AppBundle:User')->find($logged->getId());

        if(!$user)
        {
            $messageException = $this->get('translator')->trans('No se ha encontrado el usuario');
            throw $this->createNotFoundException($messageException);
        }

Появляется ошибка в строке $user = $em->getRepository

Вызов участника Функция getId () для строки

Как я могу сделать так, чтобы система сначала запрашивала у меня вход в систему, а затем перенаправляла меня на страницу, к которой я хочу получить доступ?

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Поскольку вы пытаетесь определить, вошел ли пользователь в систему или нет, вполне возможно, что вы вообще не получите пользовательскую сущность .

Если пользователь не является войдя в систему, вы не получите «пользовательский объект» из службы хранения токенов, а также получите сообщение об ошибке при попытке получить доступ к его свойствам.

Кроме того, ваш пользователь уже обновлен к этой точке (если правильно аутентифицированы), поэтому получение его из Doctrine является избыточным, и вы можете избежать этого.

Правильный способ сделать это, предполагая, что ваш пользовательский класс реализует Symfony\Component\Security\Core\User\UserInterface

$user = $this->get('security.token_storage')->getToken()->getUser();

if (!$user instanceof UserInterface) {
    // failure mode. Throw exception, return RedirectResponse, or what you prefer.
    // We are dealing with an anonymous, non-authenticated user
}

Токен (getToken()), может также быть null, так что вы можете это проверить.

Но, учитывая, что вы в контроллере, и что маршрут, обрабатываемый контроллером, должен находиться за одним из межсетевых экранов ... обычно он никогда не будет нулевым.

Если бы это было null, что-то еще не так в ваши настройки, и вам лучше поймать это прон к.

0 голосов
/ 03 марта 2020

Над ответом все в порядке, за исключением того, что вы должны проверить, возвращает ли метод getToken () действительный токен или значение NULL. Вот лучшая версия:

$user = NULL;
$token = $this->get('security.token_storage')->getToken();

if(NULL !== $token) {
    $user = $token->getUser();
}

if($user instanceof UserInterface) {
    // logged in user
}
...