Php 如果已从登录页面登录,则Symfony重定向

Php 如果已从登录页面登录,则Symfony重定向,php,symfony,redirect,symfony-2.8,Php,Symfony,Redirect,Symfony 2.8,我正在使用FOSUser Bundle登录。现在,若用户已经登录了,那个么若用户访问/login url,我如何将用户重定向到主页(“/”) 我已将SecurityController复制到src\AppBundle\Controller位置,并更改了renderlogin方法,但它不起作用 renderLogin()方法 protected function renderLogin(array $data) { if (false === $this->get('security

我正在使用FOSUser Bundle登录。现在,若用户已经登录了,那个么若用户访问/login url,我如何将用户重定向到主页(“/”)

我已将SecurityController复制到src\AppBundle\Controller位置,并更改了renderlogin方法,但它不起作用

renderLogin()方法

protected function renderLogin(array $data)
{
    if (false === $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY')) {
        return new RedirectResponse('/', 403);
    }
    return $this->render('@FOSUser/Security/login.html.twig', $data);
}
我在安全控制器中也添加了这一行

use Symfony\Component\HttpFoundation\RedirectResponse;

非常感谢您的帮助。

您需要在
SecurityController

 /**
 * Renders the login template with the given parameters. Overwrite this function in
 * an extended controller to provide additional data for the login template.
 *
 * @param array $data
 *
 * @return Response
 */
protected function renderLogin(array $data)
{
   /**
    * If the user has already logged in (marked as is authenticated fully by symfony's security)
    * then redirect this user back (in my case, to the dashboard, which is the main entry for 
    * my logged in users)
    */
   if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
       return $this->redirectToRoute('homepage');
   }
    return $this->render('@FOSUser/Security/login.html.twig', $data);
}
}
要重定向尝试访问注册页面的已验证用户,您需要更改``

class RegistrationController extends BaseController
{
/**
 * @param Request $request
 *
 * @return Response
 */
public function registerAction(Request $request)
{
    /**
    * If the user has already logged in (marked as is authenticated fully by symfony's security)
    * then redirect this user back (in my case, to the dashboard, which is the main entry for 
    * my logged in users)
    */
    if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
       return $this->redirectToRoute('homepage');
    }
    /** @var $formFactory FactoryInterface */
    $formFactory = $this->get('fos_user.registration.form.factory');
    /** @var $userManager UserManagerInterface */
    $userManager = $this->get('fos_user.user_manager');
    /** @var $dispatcher EventDispatcherInterface */
    $dispatcher = $this->get('event_dispatcher');
    $user = $userManager->createUser();
    $user->setEnabled(true);
    $event = new GetResponseUserEvent($user, $request);
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
    if (null !== $event->getResponse()) {
        return $event->getResponse();
    }
    $form = $formFactory->createForm();
    $form->setData($user);
    $form->handleRequest($request);
    if ($form->isSubmitted()) {
        if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
            $userManager->updateUser($user);
            if (null === $response = $event->getResponse()) {
                $url = $this->generateUrl('fos_user_registration_confirmed');
                $response = new RedirectResponse($url);
            }
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
            return $response;
        }
        $event = new FormEvent($form, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);
        if (null !== $response = $event->getResponse()) {
            return $response;
        }
    }
    return $this->render('@FOSUser/Registration/register.html.twig', array(
        'form' => $form->createView(),
    ));
}
}
奇怪的是,FOSUserBundle中没有解决这个问题,无论如何,我有两个Github Gist来处理这个问题:

注册:


登录:

您需要在
SecurityController

 /**
 * Renders the login template with the given parameters. Overwrite this function in
 * an extended controller to provide additional data for the login template.
 *
 * @param array $data
 *
 * @return Response
 */
protected function renderLogin(array $data)
{
   /**
    * If the user has already logged in (marked as is authenticated fully by symfony's security)
    * then redirect this user back (in my case, to the dashboard, which is the main entry for 
    * my logged in users)
    */
   if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
       return $this->redirectToRoute('homepage');
   }
    return $this->render('@FOSUser/Security/login.html.twig', $data);
}
}
要重定向尝试访问注册页面的已验证用户,您需要更改``

class RegistrationController extends BaseController
{
/**
 * @param Request $request
 *
 * @return Response
 */
public function registerAction(Request $request)
{
    /**
    * If the user has already logged in (marked as is authenticated fully by symfony's security)
    * then redirect this user back (in my case, to the dashboard, which is the main entry for 
    * my logged in users)
    */
    if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
       return $this->redirectToRoute('homepage');
    }
    /** @var $formFactory FactoryInterface */
    $formFactory = $this->get('fos_user.registration.form.factory');
    /** @var $userManager UserManagerInterface */
    $userManager = $this->get('fos_user.user_manager');
    /** @var $dispatcher EventDispatcherInterface */
    $dispatcher = $this->get('event_dispatcher');
    $user = $userManager->createUser();
    $user->setEnabled(true);
    $event = new GetResponseUserEvent($user, $request);
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
    if (null !== $event->getResponse()) {
        return $event->getResponse();
    }
    $form = $formFactory->createForm();
    $form->setData($user);
    $form->handleRequest($request);
    if ($form->isSubmitted()) {
        if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
            $userManager->updateUser($user);
            if (null === $response = $event->getResponse()) {
                $url = $this->generateUrl('fos_user_registration_confirmed');
                $response = new RedirectResponse($url);
            }
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
            return $response;
        }
        $event = new FormEvent($form, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);
        if (null !== $response = $event->getResponse()) {
            return $response;
        }
    }
    return $this->render('@FOSUser/Registration/register.html.twig', array(
        'form' => $form->createView(),
    ));
}
}
奇怪的是,FOSUserBundle中没有解决这个问题,无论如何,我有两个Github Gist来处理这个问题:

注册:


登录:

在FOS securityController中(用于登录):将其添加到登录操作中

if($session->get("_security_main"))
{
$route = $this->container->get('router')->generate('site_faim_homepage');
return new RedirectResponse($route);

    }

在FOS securityController中(用于登录):将其添加到登录操作

if($session->get("_security_main"))
{
$route = $this->container->get('router')->generate('site_faim_homepage');
return new RedirectResponse($route);

    }

这适用于在用户登录时重定向用户。但在登录后,如果loggedin用户再次访问/登录,则应重定向到主页。这不起作用。我加了它,但它不起作用。事实上,当我访问/登录时,甚至没有调用loginAction()。。。。!实际上,src\AppBundle\controller\SecurityController中的控制器并没有覆盖FOS\UserBundle\controller中的SecurityController。因此,在前者中所做的任何更改都不会得到反映。这可以在用户登录时重定向用户。但在登录后,如果loggedin用户再次访问/登录,则应重定向到主页。这不起作用。我加了它,但它不起作用。事实上,当我访问/登录时,甚至没有调用loginAction()。。。。!实际上,src\AppBundle\controller\SecurityController中的控制器并没有覆盖FOS\UserBundle\controller中的SecurityController。因此,在前者中所做的任何更改都不会得到反映。这不起作用,即使在用户登录之后,它也会显示登录页面。您是否设置了正确的路由名称<代码>返回$this->redirectToRoute(“主页”)主页是我的路线名称你的可能不同!我的也是“主页”路径名。我已经检查了..即使是loginAction,renderLogin,这些方法在我访问/登录时都不会被调用。。。!实际上,src\AppBundle\controller\SecurityController中的控制器并没有覆盖FOS\UserBundle\controller中的SecurityController。因此,在前者中所做的任何更改都不会得到反映。这不起作用,即使在用户登录之后,它也会显示登录页面。您是否设置了正确的路由名称<代码>返回$this->redirectToRoute(“主页”)主页是我的路线名称你的可能不同!我的也是“主页”路径名。我已经检查了..即使是loginAction,renderLogin,这些方法在我访问/登录时都不会被调用。。。!实际上,src\AppBundle\controller\SecurityController中的控制器并没有覆盖FOS\UserBundle\controller中的SecurityController。因此,对前者所做的任何改变都没有得到反映。