Промежуточное программное обеспечение CSRF не активируется

#cakephp #cakephp-3.0

#cakephp #cakephp-3.0

Вопрос:

Вот что у меня есть

Cakephp 3.7.2; в моем routes.php :

 <?php

use CakeCorePlugin;
use CakeRoutingRouteBuilder;
use CakeRoutingRouter;
use CakeRoutingRouteDashedRoute;
use CakeHttpMiddlewareCsrfProtectionMiddleware;

Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function (RouteBuilder $routes) {
    $routes->registerMiddleware('csrf', new CsrfProtectionMiddleware());
    $routes->applyMiddleware('csrf');
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->fallbacks(DashedRoute::class);
});
/*
Router::scope('/api', function ($routes) {
  // connect routes with *no* CSRF protection as that middleware is not active
  // for this routing scope.
});
*/
Router::prefix('api', function ($routes) {
    $routes->prefix('users', function ($routes) {
        $routes->fallbacks(DashedRoute::class);
    });
});

  

Что я делаю

Сделайте запрос POST к /api/users с помощью Postman. Запрос выполняется, и я вижу правильный ответ. Я хочу убедиться, что у меня включена защита для остальной части сайта, поэтому я ожидаю одну из отсутствующих ошибок CSRF token cookie. После подтверждения я раскомментирую исключение маршрута API.

Что я пробовал

  • Следуйте за controllers/middleware.html#csrf-middleware и поместите registerMiddleware() вызов в src/Application.php
  • Добавьте какую-нибудь тарабарщину в applyMiddleware() вызов. Он жалуется на невозможность найти это промежуточное программное обеспечение, что подтверждает, что функция действительно вызывается
  • Поместите $this->loadComponent('Csrf'); в AppController.php . Это работает, и я получаю отсутствующий файл cookie токена CSRF. Он не показывает мне предупреждение о конфликтующих компонентах, как на этой странице говорится, что это должно

У меня сложилось впечатление, что промежуточное программное обеспечение не было включено должным образом, но мне не очевидно, что именно не так. Пожалуйста, помогите

Комментарии:

1. Я смогу принять ответ и закрыть вопрос через два дня. Я решил оставить его здесь для пользователей Google. Это было не очевидно для меня, может быть не очевидно для кого-то другого.

Ответ №1:

Оказывается, это была действительно правильная настройка.

Я не понимал, что нижний Router::prefix вызов без промежуточного программного обеспечения отменит вышеупомянутый Router::scope вызов (т. Е. будет действовать как исключение), но это произошло.