Symfony 2.5:在条件下从任何页面重定向

时间:2016-05-18 13:14:14

标签: php redirect response event-listener symfony-2.5

我正在制作一个自定义"访问控制",这与某些逻辑而不是角色有关。

如果在数据库中设置了特定选项,则用户可以继续,如果不是,他需要从系统中的任何位置重定向到某个页面,无论方式如何(导航,直接网址等。)。

到目前为止,我已经创建了一个 SecurityListener ,它基本上通过names.directory_path = (TNSNAMES, EZCONNECT) 方法从数据库中提取选项,并将它们存储在Security上下文中,以便我可以访问它们在任何时间,从任何地方。那部分按预期工作。

现在我不知道在哪里添加重定向逻辑。我正在考虑添加新的响应式监听器并修改onSecurityInteractiveLogin()方法,但它似乎不起作用。这就是我到目前为止所做的:

onKernelResponse()

在我的 service.xml 文件中,我按如下方式描述了该服务:

namespace MyProj\UserBundle\EventListener;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;

class ResponseListener
{
    public function __construct(SecurityContextInterface $security,     Session $session, RouterInterface $router)
   {
       $this->security = $security;
       $this->session = $session;
       $this->router = $router;
   }

   public function onKernelResponse(FilterResponseEvent $event)
   {
       //$response = $event->getResponse();
       //$event->setResponse($response);

       return new RedirectResponse($this->router->generate('intro_page'));        
   }

它并没有真正做任何事情。我错过了什么,我使用的是正确的方法吗?我愿意接受任何建议,谢谢。

2 个答案:

答案 0 :(得分:0)

不确定sf 2.5,但我认为你的活动名称应为" kernel.response"不只是"回应"。

另外我会使用而不是使用kernelRequest而不是Response,因此您将保存一些与确定无关的进程。

答案 1 :(得分:0)

尝试AccessListener这样:

class AccessListener
    {
    private$security;
    private $router;

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

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($this->security->isGranted('PINK_UNICORN')) {
            $url = $this->router->generate('pink_unicorn_totorial');
            $event->setResponse(new RedirectResponse($url));
        }
    }
}

将其添加到您的services.yml:

services:
  access_listener:
    class: Acme\DemoBundle\Listener\AccessListener
    arguments: [ @security.context, @router ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }