Не могу сделать редирект после авторизации

я использую fosuserbundle в symfony 3.4. я хотел перенаправить после входа в систему, проблема в том, что не могу перенаправить после входа в систему, он всегда остается на странице входа, даже если я уже вошел в систему здесь вы можете найти мой код (https://gist.github.com/Бахши-Фейсал/b0eda6075af53130b2e6513059e07802)

я попробовал код ниже

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $roles = $token->getRoles();

    $rolesTab = array_map(function ($role) {
        return $role->getRole();
    }, $roles);

    if (in_array('ROLE_COMPTABLE', $rolesTab, true)) {
        // c'est un aministrateur : on le rediriger vers l'espace admin
        $redirection = new RedirectResponse($this->router->generate('comptable'));
    } else {

        $redirection = new RedirectResponse($this->router->generate('visiteur'));
    }

    return $redirection;
}

Вы убедились, что данный код выполняется? Как вы отлаживали свою проблему дальше?

Nico Haase 15.04.2019 16:48

хорошо, я думаю, что SecurityControler в fosuserBundle предотвращает выполнение моей функции, и я не получаю никаких ошибок, поэтому моя функция работает, но не может быть выполнена из-за SecurityController @NicoHaase

Faisal 15.04.2019 16:57

Ну, ключевой момент: согласно всему этому коду, вы только что определили какой-то метод onAuthenticationSuccess без какого-либо контекста. Как Symfony должен догадаться, что вы хотите выполнить его в определенный момент времени?

Nico Haase 15.04.2019 17:13

Взгляните на stackoverflow.com/questions/41440417/…, там показаны два способа решения вашей проблемы.

Nico Haase 15.04.2019 17:14

Вы немного запутались при создании вашего LoginHandler (а не контроллера), попробуйте следовать этому ответу, он делает именно то, что вы пытаетесь: stackoverflow.com/a/31167310/1259367

Snroki 15.04.2019 17:17

хорошо, дай мне бабло, спасибо :D

Faisal 15.04.2019 17:32

все та же проблема, даже после того, как я вхожу в систему, она остается на странице входа в систему 0 перенаправлений, которые я сделал точно так же, как ссылка, которую вы мне сказали.

Faisal 15.04.2019 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
7
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Оставаться на той же странице означает, что вы фактически не получаете доступ к своему коду.

Вы должны обрабатывать это в листнере, а не в контроллере.

Ваш класс LoginController должен называться LoginListener и находиться в какой-то папке событий.

Контроллер используется только для содержания действия. Это может быть вашей проблемой.

Вот пример перенаправления пользователя в зависимости от страниц, к которым он пытается получить доступ, независимо от того, подключен он или нет:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Model\User;

/**
 * Class RedirectUserListener
 * @package AppBundle\EventListener
 */
class RedirectUserListener
{
private $tokenStorage;
private $router;

/**
 * RedirectUserListener constructor.
 * @param TokenStorageInterface $tokenStorage
 * @param RouterInterface $router
 */
public function __construct(TokenStorageInterface $tokenStorage, RouterInterface $router)
{
    $this->tokenStorage = $tokenStorage;
    $this->router = $router;
}

/**
 * @param GetResponseEvent $event
 */
public function onKernelRequest(GetResponseEvent $event)
{
    if ($this->isUserLogged() && $event->isMasterRequest()) {
        /** @var \AppBundle\Entity\User $user */
        $user = $this->tokenStorage->getToken()->getUser();
        if (empty($user->getModifiedBy())) {
            $user->setModifiedBy($user);
        }
        $currentRoute = $event->getRequest()->attributes->get('_route');
        if ($this->isAuthenticatedUserOnAnonymousPage($currentRoute)) {
            $response = new RedirectResponse($this->router->generate('app_default_index'));
            $event->setResponse($response);
        }
    }
}


/**
 * @return bool
 */
protected function isUserLogged()
{
    $token = $this->tokenStorage->getToken();
    if (is_null($token)) {
        return false;
    }
    $user = $token->getUser();
    return $user instanceof User;
}

/**
 * @param $currentRoute
 * @return bool
 */
protected function isAuthenticatedUserOnAnonymousPage($currentRoute)
{
    return in_array(
        $currentRoute,
        ['fos_user_security_login', 'fos_user_resetting_request', 

'app_user_registration']
        );
    }
}

И в services.yml:

app.tokens.action_listener:
    class: AppBundle\EventListener\RedirectUserListener
    arguments:
        - "@security.token_storage"
        - "@router"
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

Я не использую метод getModifiedBy() для пользователя. il fait quoi ce méthode @Florent Cardot

Faisal 15.04.2019 19:19

Это просто атрибут объекта пользователя, например, getName() или getPassword(). Не зацикливайтесь на этом ;)

Florent Cardot 16.04.2019 09:17
Ответ принят как подходящий

я нашел другой способ перенаправления после входа в систему в соответствии с ролью пользователя

 /**
     * @Route("/accueil")
     */
    public function redirectAction()
    {
        $authChecker = $this->container->get('security.authorization_checker');

        if ($authChecker->isGranted('ROLE_COMPTABLE')) {
            return $this->render('comptes/comptable/comptable.html.twig', array());

        } elseif ($authChecker->isGranted('ROLE_VISITEUR')) {
            return $this->render('comptes/visiteur/visiteur.html.twig',array());

        } else {
            return $this->render('userLogin.html.twig', array());
        }
    }

и в security.yml в разделе брандмауэров и в основном разделе я добавляю это always_use_default_target_path: false и default_target_path: /accueil, и это работает отлично. одна вещь, которую я мог забыть сказать, я использую fosuserbundle, моя функция хорошо работает с ним

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