2012-05-07 3 views
14

Я создаю веб-приложение с Symfony 2, используя комплект FOSUserBundle.
Пользователи создают учетную запись, авторизуются и начинают использовать приложение.Перенаправление, если пользователь зарегистрирован

То, что я хочу добиться сейчас, что пользователь перенаправляется на свой счет с любой страницы, они могут быть в случае, если они вошли в
Это включает в себя:.

  • , если они вернутся к логину страница
  • если они вернуться на страницу регистрации
  • , если они идут на главную страницу сайта
  • раз они подтверждают свою электронную почту
  • ОНК е они сбросить пароль

В принципе код будет выглядеть примерно так:

$container = $this->container; 
$accountRouteName = "DanyukiWebappBundle_account"; 
if($container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){ 
    // authenticated (NON anonymous) 
    $routeName = $container->get('request')->get('_route'); 
    if ($routeName != $accountRouteName) { 
     return $this->redirect($this->generateUrl($accountRouteName)); 
    } 
} 

Проблема в том, я не знаю, где этот код должен идти.
Он должен быть выполнен для любого запроса. В Symfony 1 я бы использовал фильтр.

ответ

32

Я нашел решение сам:

<?php 

namespace Danyuki\UserBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class LoggedInUserListener 
{ 
    private $router; 
    private $container; 

    public function __construct($router, $container) 
    { 
     $this->router = $router; 
     $this->container = $container; 
    }  

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $container = $this->container; 
     $accountRouteName = "DanyukiWebappBundle_account"; 
     if($container->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){ 
      // authenticated (NON anonymous) 
      $routeName = $container->get('request')->get('_route'); 
      if ($routeName != $accountRouteName) { 
       $url = $this->router->generate($accountRouteName); 
       $event->setResponse(new RedirectResponse($url)); 
      } 
     } 
    } 
} 

И затем, в services.yml файл моей пачки:

services: 
    kernel.listener.logged_in_user_listener: 
      class: Danyuki\UserBundle\Listener\LoggedInUserListener 
      tags: 
       - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
      arguments: [ @router, @service_container ] 
+13

Это не рекомендует вводить контейнер в службе , вы можете ввести службу security.context. –

+7

@benjamin Это еще проще. Поскольку @dan нуждается в объекте запроса, он может извлечь его из события через '$ event-> getRequest()'. См. Http://stackoverflow.com/a/11506088/838733, http://symfony.com/doc/current/cookbook/event_dispatcher/before_after_filters.html#after-filters-with- the-kernel-response-event или https://github.com/symfony/symfony/blob/2.0/src/Symfony/Component/HttpKernel/Event/KernelEvent.php – nietonfir

1

Вы также можете сделать это решение, если вы хотите просто проверить один раз :

Событие запускается каждый раз, когда выполняется успешный вход в систему. События называется:

security.interactive_login

Для того, чтобы подписаться на это событие, вы должны создать контейнер службы с созданным классом, скажем, «LoginListener.php» и вводить тег "kernel.even_listener" с событием "security.interactive_login":

<service id="mylogin.success.listener" class="path\to\class\LoginListener"> 
    <tag name="kernel.event_listener" event="security.interactive_login" method="onLoginSuccess" /> 
</service> 

в LoginListener:

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 

public function onLoginSuccess(InteractiveLoginEvent $event) { 
    if ($this->_security->isGranted('IS_AUTHENTICATED_FULLY')) { 
     //your code here... 
    } 
} 

вы можете также добавить другую зависимость и ввести его в конструктор, в моем случае я должен был впрыснуть безопасность, сессию и контейнер:

public function __construct(SecurityContext $security, Session $session,   ContainerInterface $container) { 

} 
Смежные вопросы