#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
вызов (т. Е. будет действовать как исключение), но это произошло.