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/sitemap127.0.0.1リクエストはサーバーによって(ループバックインターフェースを介して)行われるため、コントローラーの埋め込みは機能します。


  • /privateURL の先頭にある属性を使用して、同じ方法でサブリクエストを保護できるようになりました。
  • アクセス リスト内のこれらの要素の順序は重要です。私は通常、非常に安全な要素をリストの一番上に置きます。
于 2013-03-19T00:46:26.030 に答える