Перенаправление Symfony, если вы уже вошли в систему со страницы входа

Я использую FOSUser Bundle для входа в систему. Теперь, если пользователь уже вошел в систему, как я могу перенаправить пользователя на домашнюю страницу ('/'), если пользователь посещает URL-адрес /login.

Я скопировал 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;

Любая помощь горячо приветствуется.


person Aamir    schedule 29.09.2017    source источник


Ответы (2)


Ну, вам нужно внести некоторые изменения в 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, которые решают эту проблему:

Регистрация: https://gist.github.com/teeyo/147f2d5d21d1beadce133a51b02d9570

Логин: https://gist.github.com/teeyo/121e21b35d71a9ab4a8f321043b6f6cd

person teeyo    schedule 29.09.2017
comment
Это не работает, страница входа отображается даже после входа пользователя в систему. - person Aamir; 29.09.2017
comment
Вы установили правильное имя маршрута? return $this->redirectToRoute('homepage'); домашняя страница - это мое название маршрута, ваше может быть другим ! - person teeyo; 29.09.2017
comment
мой также является именем маршрута домашней страницы. - person Aamir; 29.09.2017
comment
Я проверил... даже loginAction, renderLogin, эти методы даже не вызываются, когда я посещаю /login...! - person Aamir; 29.09.2017
comment
На самом деле контроллер в src\AppBundle\Controller\SecurityController не переопределяет контроллер безопасности в FOS\UserBundle\Controller. Таким образом, любые изменения, внесенные в первый, не отражаются. - person Aamir; 29.09.2017

В FOS securityController (для входа): добавьте это в действие входа

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

    }
person Dhia Eddine Farah    schedule 29.09.2017
comment
Это работает для перенаправления пользователя, если пользователь входит в систему. Но после входа в систему, если пользователь, вошедший в систему, снова посещает /login, он должен перенаправить на домашнюю страницу. Это не работает. - person Aamir; 29.09.2017
comment
Я добавил его, но он не работает. На самом деле, я проверил, что loginAction() даже не вызывается, когда я посещаю /login....! - person Aamir; 29.09.2017
comment
На самом деле контроллер в src\AppBundle\Controller\SecurityController не переопределяет контроллер безопасности в FOS\UserBundle\Controller. Таким образом, любые изменения, внесенные в первый, не отражаются. - person Aamir; 29.09.2017