登录后无法进行重定向

问题描述 投票:0回答:2

我在symfony 3.4中使用fosuserbundle。我想在登录后重定向问题是无法重定向登录后它始终保持在登录页面即使我是alerdy登录这里你可以找到我的代码(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;
}
symfony fosuserbundle
2个回答
0
投票

保持同一页面意味着您实际上不会访问您的代码。

您应该在侦听器中处理它,而不是在控制器中处理它。

您的类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 }

0
投票

我发现根据用户角色登录后重定向的另一种方法我创建了一个控制器并添加了这个功能。

 /**
     * @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我的功能很好用

© www.soinside.com 2019 - 2024. All rights reserved.