CSRF中间件未激活

时间:2019-04-04 11:52:13

标签: cakephp cakephp-3.0

这就是我所拥有的

Cakephp 3.7.2;在我的routes.php中:

<?php

use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;
use Cake\Http\Middleware\CsrfProtectionMiddleware;

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);
    });
});

我在做什么

使用Postman/api/users发出POST请求。请求通过,我看到正确的响应。我想确保在网站的其余部分都启用了保护功能,因此我期待其中的缺少CSRF令牌cookie 错误之一。确认后,我将取消注释API路由异常。

我尝试过的

  • 关注controllers/middleware.html#csrf-middleware,然后将registerMiddleware()呼叫放入src/Application.php
  • applyMiddleware()调用中添加一些乱码。它抱怨找不到该中间件,从而确认该函数确实被调用
  • $this->loadComponent('Csrf');放入AppController.php中。它有效,我确实得到了缺少CSRF令牌cookie 。它没有向我显示有关组件冲突的警告 ,例如this page

我对中间件没有正确启用感到印象深刻,但是对我来说到底是什么错误并不明显。请协助

1 个答案:

答案 0 :(得分:0)

结果证明这实际上是正确的设置。

我不知道没有中间件的较低的Router::prefix调用会否定以上的Router::scope调用(即作为例外),但是确实如此。