【问题标题】:CSRF middleware doesn't get activatedCSRF 中间件没有被激活
【发布时间】:2019-08-26 04:10:21
【问题描述】:

这就是我所拥有的

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 请求。请求通过,我看到了正确的响应。我想确保我为站点的其余部分启用了保护,所以我期待其中一个 Missing CSRF token cookie 错误。一旦确认,我将取消注释 API 路由异常。

我尝试过的

  • 关注controllers/middleware.html#csrf-middleware 并将registerMiddleware() 呼叫转入src/Application.php
  • applyMiddleware() 调用中添加一些废话。它抱怨找不到该中间件,这证实了该函数确实被调用了
  • $this-&gt;loadComponent('Csrf'); 放入AppController.php。它有效,我确实得到了 Missing CSRF 令牌 cookie。它没有向我显示关于冲突组件的警告,如 this page 所说的应该

我的印象是中间件没有正确启用,但对我来说究竟出了什么问题并不明显。请帮忙

【问题讨论】:

  • 我将能够在两天内接受答案并关闭问题。我决定把它留在这里供谷歌人使用。这对我来说并不明显,对其他人可能并不明显。

标签: cakephp cakephp-3.0


【解决方案1】:

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

我没有意识到没有中间件的较低的Router::prefix 调用会否定上面的Router::scope 调用(即充当例外),但确实如此。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多