Symfony Can';登录后不要重定向

Symfony Can';登录后不要重定向,symfony,fosuserbundle,Symfony,Fosuserbundle,我在symfony 3.4中使用fosuserbundle。 我想在登录后重新定向问题是登录后无法重新定向它始终停留在登录页面中,即使我是alerdy登录 在这里您可以找到我的代码() 我试过下面的代码 public function onAuthenticationSuccess(Request $request, TokenInterface $token) { $roles = $token->getRoles(); $rolesTab = array_map(fu

我在symfony 3.4中使用fosuserbundle。 我想在登录后重新定向问题是登录后无法重新定向它始终停留在登录页面中,即使我是alerdy登录 在这里您可以找到我的代码()

我试过下面的代码

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;
}

停留在同一页面意味着您实际上无法访问代码

您应该在listner中处理此问题,而不是在控制器中

您的类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']
        );
    }
}

停留在同一页面意味着您实际上无法访问代码

您应该在listner中处理此问题,而不是在控制器中

您的类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']
        );
    }
}

您是否确保已执行给定的代码?您是如何进一步调试您的问题的?我认为fosuserBundle中的SecurityController阻止了我的函数执行,我没有收到任何错误,因此我的函数可以工作,但无法执行,因为SecurityController@NicoHaaseWell,关键点是:根据所有代码,您刚刚在AuthenticationSuccess上定义了一些方法,没有任何上下文。Symfony应该如何猜测您希望在某个特定的时间点执行它?看看,它显示了两种解决问题的方法您在创建LoginHandler(而不是Controller)时有点搞砸了。请尝试遵循以下答案,它正是您所尝试的:您是否确保执行给定的代码?您是如何进一步调试您的问题的?我认为fosuserBundle中的SecurityController阻止了我的函数执行,我没有收到任何错误,因此我的函数可以工作,但无法执行,因为SecurityController@NicoHaaseWell,关键点是:根据所有代码,您刚刚在AuthenticationSuccess上定义了一些方法,没有任何上下文。Symfony应该如何猜测您希望在某个特定的时间点执行它?看看,它显示了两种解决问题的方法。您在创建LoginHandler(而不是Controller)时有点搞砸了。请尝试遵循这个答案,它正是您所尝试的:je n'ai pas le méthode getModifiedBy()dans ma entitéUser。il fait qoi ce méthode@Florent CardotIt只是用户实体的一个属性,如getName()或getPassword()。不要把注意力放在那上面;)这是一种由用户修改的方法。il fait qoi ce méthode@Florent CardotIt只是用户实体的一个属性,如getName()或getPassword()。不要把注意力放在那上面;)