2012-06-28 24 views
1

我創建了顯示網站站點地圖的路線sitemap。該網站地圖是使用以下枝條建設包括在幾乎每一頁:隱藏僅用於Silex中的子請求的路線

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

所以,在調試,我會看到頁面了。這工作完美。雖然,站點地圖也可以使用/sitemap。我怎樣才能避免這種情況?即有沒有一種方法可以使網站地圖路線僅適用於子請求?

回答

1

不知何故,您需要檢查當前處理的請求是主請求還是子請求。這是由render正確設置,然後傳遞到handle,然後到kernel。不幸的是,從控制器(或中間件)獲取類型並不容易。

解析請求後,但在執行控制器之前,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); 
    } 
}); 
+0

事實上,安全服務提供商最近被納入了,沒有想到 - 現在也沒有使用它。有沒有使用Symfony2的防火牆的方法? – hvtilborg

+0

@hvtilborg我已將我的答案更改爲不同的解決方案。 – Maerlyn

+1

這將不起作用,因爲子請求將具有與主要請求相同的遠程地址。 – hvtilborg

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屬性同樣的方式任意子請求。
  • 訪問列表中這些元素的順序很重要。我通常把非常安全的元素放在列表的頂部。