Symfony 2.5:根据条件从任何页面重定向



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

如果在数据库中设置了特定的选项,用户可以继续,如果没有,则需要从系统中的任何位置重定向到某个页面,而不考虑方式(导航、直接URL等)

到目前为止,我已经创建了一个SecurityListener,它基本上通过onSecurityInteractiveLogin()方法从数据库中提取选项,并将它们存储在Security上下文中,这样我就可以随时随地访问它们。那部分工作正常。

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

namespace MyProjUserBundleEventListener;
use SymfonyComponentSecurityCoreSecurityContextInterface;
use SymfonyComponentSecurityCoreSecurityContext;
use SymfonyComponentHttpFoundationSessionSession;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyComponentRoutingRouterInterface;
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'));        
   }

在我的service.xml文件中,我对服务的描述如下:

<service id="response.listener" class="MyProjUserBundleEventListenerResponseListener">
        <tag name="kernel.event_listener" event="response" method="onKernelResponse" />
        <argument type="service" id="security.context" />
        <argument type="service" id="session" />
        <argument type="service" id="router" />
    </service>

它真的没有任何作用。我是否遗漏了什么?我是否使用了正确的方法?我愿意接受任何建议,谢谢。

不确定sf2.5,但我认为您的事件名称应该是"kernel.response",而不仅仅是"response"。

此外,我宁愿使用kernelRequest而不是Response,所以您将保存一些最终不相关的过程。

尝试使用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));
        }
    }
}

将其添加到您的服务中。yml:

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

相关内容

  • 没有找到相关文章

最新更新