1

我创建了一条sitemap显示站点站点地图的路线。该站点地图几乎包含在使用以下 Twig 构造的每个页面中:

{% if app.debug %}
{{ render(path('sitemap')) }}
{% else %}
<esi:include src="{{ path('sitemap') }}" />
{% endif %}

这样在调试中我也会看到该页面。这很完美。虽然,站点地图也可以使用/sitemap. 我怎样才能避免这种情况?即有没有一种方法可以使站点地图路线仅可用于子请求?

4

2 回答 2

1

您需要以某种方式检查当前处理的请求是主请求还是子请求。这由render正确设置,然后传递给handle,然后传递给内核。不幸的是,没有简单的方法可以从控制器(或中间件)获取类型。

HttpKernel 在解析请求之后,但在执行控制器之前发出 KernelEvents::CONTROLLER 事件。这将获取请求类型。

如果你像这样写一个事件监听器,你仍然可以中止:

use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

$app["dispatcher"]->addListener(KernelEvents::CONTROLLER, function (FilterControllerEvent $event) use ($app) {
    $internals = array("sitemap");
    $route = $event->getRequest()->get("_route");

    if (in_array($route, $internals) && $event->getRequestType() == HttpKernelInterface::SUB_REQUEST) {
        return $app->abort(403);
    }
});
于 2012-06-28T10:47:22.593 回答
1

将此添加到您的security.yml文件将允许您保护控制器:

access_control:
    - { path: ^/private, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1  }
    - { path: ^/private, roles: ROLE_NO_ACCESS }

然后将您的控制器放在以以下开头的路径下/private

<route id="whatever" pattern="/private/sitemap">
        <default key="_controller">AcmeDemoBundle:Sitemap:whatever</default>
</route>

这是一种保护所有子请求的通用方法/private,以使人们无法访问/private/sitemap。嵌入控制器将起作用,因为您的服务器将发出请求(127.0.0.1通过环回接口)。


  • /private您现在可以使用URL 开头的属性以相同的方式保护任何子请求。
  • 这些元素在访问列表中的顺序很重要。我通常将非常安全的元素放在列表的顶部。
于 2013-03-19T00:46:26.030 回答