Symfony 2:如何在自定义事件上进行防火墙自定义重定向

时间:2014-05-16 13:37:44

标签: symfony firewall http-redirect

我的symfony应用程序处理多个“博客”(多站点wordpress样式)

  • 我的博客有一些特殊的状态,其中包括: closed_status
  • 我为某些特殊权利创建了一个选民,这让我可以知道选民是否应该允许访问,或者在验证我们正在访问的博客是打开/关闭时... **示例网址:http://blog01.myapp.com http://blog18.myapp.com ....
  • 现在我抛出一个403错误并使用403例外的自定义管理,但我想避免这种情况,而是重新定位选民处理我的请求。 **就像当你没有经过身份验证并且被重定向到/ login等时会发生什么。

我不是要求一个完整的解决方案,你能告诉我我应该研究哪些类/概念吗?

我认为或者听众+ entryPoints很多但是并没有真正了解它是如何工作的。

在我看来,这需要认证==>重定向到登录的东西在symfony中非常精确地编码。

ps:我正在使用fosUserBundle并尝试覆盖尽可能少的捆绑和关于防火墙。

我希望实现的流程:

  • 请求博客网址
  • => myCustomVoter拒绝和发送(CLOSED)或发送(PRIVATE)或发送(VIPONLY)
  • =>它导致我的setpsController动作(在某处定义)的干净重定向

2 个答案:

答案 0 :(得分:0)

在选民中发送自定义事件。在该事件的事件监听器中设置对RedirectResponse

的响应

答案 1 :(得分:0)

确定,

  • 我注意到(想)我不能在当前防火墙上添加一个监听器(告诉我我是不是错了)。
  • 我也注意到要做我想要的东西我需要将setResponse设置为GetResponseEvent。
    • 所以我刚创建了一个通用的侦听器,没有连接到防火墙:
    • 它会收听我的自定义事件以及 kernel.request ,这是一个GetResponseEvent
    • 现在我只是跳跃所有人都会按照适合我的顺序听取:
      • 我的服务确定,如果博客是开放的,公开的...并且最终会发送我的自定义事件
      • 我的自定义侦听器,它将接收自定义事件并准备响应
      • 我的自定义侦听器,它接收kernel.request并注入我计算的响应(如果存在)

对于我的第一次测试它似乎工作,但我需要进行广泛测试,以确保防火墙监听器不会弄乱我的进程(我不应该这样认为)

以下是我如何定义我的听众。

route_access_listener:
    class: [...]\RouteAccessListener
    arguments:
        - @service_container
    tags:
        - { name: kernel.event_listener, event: routeAccessRedirect, method: onCustomRouteAccess }
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

以下是我的监听器的实现:

[...]

public function onKernelRequest(GetResponseEvent $event)
{
    if($this->response)
        $event->setResponse($this->response);
}

public function onCustomRouteAccess(RouteAccessEvent $event)
{
    $type = $event->getType();

    switch($type){
        case RouteAccessManager::DR_IS_USER_OF_OTHER_BLOG:
            $redirectPath = 'link_to_blog';
            break;

        case RouteAccessManager::DR_BLOG_CLOSED:
            $redirectPath = 'info_closed_blog';
            break;

        case RouteAccessManager::DR_PRIVATE_BLOG:
            $redirectPath = 'info_private_blog';
            break;

        case RouteAccessManager::DR_USER_NOT_ENABLED_BLOG:
            $redirectPath = 'info_not_enabled_on_blog';
            break;

        case RouteAccessManager::DR_INVALID_HOSTNAME:
            $redirectPath = 'info_invalid_hostname';
            break;
    }


    $url = $this->container->get('router')->generate($redirectPath);
    $this->response = new RedirectResponse($url);
}