Не могу сделать перенаправление после входа в систему - PullRequest
0 голосов
/ 15 апреля 2019

я использую fosuserbundle в symfony 3.4.я хотел перенаправить после входа в систему, проблема не может быть перенаправлена ​​после входа в систему, она всегда остается на странице входа в систему, даже если я зарегестрирован здесь, вы можете найти мой код (https://gist.github.com/Bakhshi-Faisal/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;
}

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я обнаружил другой способ перенаправления после входа в систему в соответствии с ролью пользователя, создал Contoller и добавил эту функцию.

 /**
     * @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, моя функция хорошо с ней работает

0 голосов
/ 15 апреля 2019

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

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

Ваш класс 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 }
...