在Laravel

时间:2015-08-21 10:43:35

标签: php laravel csrf csrf-protection

最近我一直在努力学习与Laravel合作。大多数教程都在4.*,但没关系。到目前为止,实现/转换一些已删除的功能正常。我发现版本5.*已弃用beforeFilter,如下所示:

public function __construct() {
    $this->beforeFilter('csrf', array('on' => ['post', 'put', 'patch', 'delete']));
}

我想将其转换为版本5.*。根据我的理解,这可以通过中间件完成,但我不知道如何才能实现相同的结果。我已经阅读了文档,但这并没有真正帮助我理解这个主题。

VerifyCsrfToken.php文件夹中已存在一个名为app/Http/Middleware的中间件文件,其中包含以下代码:

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

任何人都可以指导我进行设置并帮助我更好地了解中间件吗?谢谢。

1 个答案:

答案 0 :(得分:1)

由于CSRF保护是Laravel 5捆绑在一起的,因此这实际上是它在Illuminate\Foundation\Http\Middleware\VerifyCsrfToken类中检查的内容,您看到VerifyCsrfToken.php中已扩展。

如果您查看该类的handle方法,您会看到第一个使验证成功的条件,调用isReading方法,如下所示:

/**
 * Determine if the HTTP request uses a ‘read’ verb.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return bool
 */
protected function isReading($request)
{
    return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
}

这相当于你的beforeFilter在Laravel 4中所做的,因此允许请求执行" read"动词并在使用任何其他动词时自动验证令牌,例如postputpatchdelete

如果您查看Laravel CSRF Protection Documentation,则会看到其中一段内容为:

  

您无需在POST,PUT或DELETE请求上手动验证CSRF令牌。 VerifyCsrfToken HTTP中间件将验证请求输入中的令牌是否与会话中存储的令牌匹配。

因此,您不再需要拥有该过滤器。至于理解中间件如何在Laravel中工作,阅读整个HTTP Middleware Documentation将帮助您弄清楚它是如何工作的。