【问题标题】:Converting beforeFilter (4.*) to Middleware (5.*) in Laravel在 Laravel 中将 beforeFilter (4.*) 转换为 Middleware (5.*)
【发布时间】:2015-08-21 19:09:47
【问题描述】:

最近我一直在努力学习如何使用 Laravel。大多数教程都在4.*,但没关系。到目前为止,实施/转换一些已弃用的功能进展顺利。我发现5.* 版本已弃用beforeFilter,如下所示:

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

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

app/Http/Middleware 文件夹中已有一个名为 VerifyCsrfToken.php 的中间件文件,代码如下:

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 = [
        //
    ];
}

谁能指导我进行设置并帮助我更好地理解中间件?谢谢。

【问题讨论】:

    标签: php laravel csrf csrf-protection


    【解决方案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 中所做的,因此允许请求执行“读取”动词并在使用任何其他动词时自动验证令牌,例如 postput , patch, delete.

    如果您查看Laravel CSRF Protection Documentation,您会看到有一段内容如下:

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

    所以你不再需要那个过滤器了。至于了解中间件在 Laravel 中的工作原理,阅读整个 HTTP Middleware Documentation 将有助于您了解它是如何工作的。

    【讨论】:

    • 谢谢先生的详细解释。这对我理解这个话题很有帮助。
    猜你喜欢
    • 2014-08-06
    • 2017-06-22
    • 2018-02-16
    • 2015-09-21
    • 2019-08-27
    • 1970-01-01
    • 2015-02-24
    • 2013-04-10
    • 2016-08-26
    相关资源
    最近更新 更多