【问题标题】:Is there a way to exclude a route from CSRF protection from within a package in Laravel 5?有没有办法从 Laravel 5 的包中排除 CSRF 保护的路由?
【发布时间】:2016-01-15 15:09:05
【问题描述】:

我知道 VerifyCsrfToken 中间件 (app/Http/Middleware/VerifyCsrfToken.php) 的 $except 属性,但我正在寻找一种从我的包中执行类似操作的方法(因此安装它的用户不必修改他们的VerifyCsrfToken.php 我上班的路线)。

我可以在我的包上定义路由,但我不知道如何从默认中间件中排除一个(或多个)路由。我尝试在自己的包上扩展Illuminate\Foundation\Http\Middleware\VerifyCsrfToken,但没有成功。

【问题讨论】:

  • 看来我的问题的答案是“不,没有办法”。查看docs for Cashier(带有需要绕过中间件的发布路由的内部包),您需要为每个应用手动添加到app/Http/Middleware/VerifyCsrfToken.php 的路由。如果你问我很不方便,但我想没有其他办法。
  • 我感受到你的痛苦。我asked a very similar question just now。我探索了许多解决方法,其中一种可能对您有用,但我怀疑让用户修改 VerifyCsrfToken 将仍然是唯一可行的解​​决方案。

标签: php package laravel-5.1 laravel-routing


【解决方案1】:

不,没有。当在 app/Http/Kernel.php 类的 $middleware 属性中提供中间件时,始终会执行中间件。

这是一件好事。您想让开发人员完全控制他们是否要在其应用程序中启用安全检查。

如果您确实需要路由异常,您可以简单地要求手动将异常添加到 VerifyCsrfToken 类。

据我所知,服务容器无法访问 VerifyCsrfToken 类中的 $exceptarray。即使您可以找到创建中间件实例的方法,内核也只会创建中间件类的新实例。由于异常列表不是静态的,因此无法更改。

【讨论】:

    【解决方案2】:

    是的,它实际上非常简单,并且在位于 here 的文档中也有介绍,但为简单起见,以下是供您参考的答案:

        <?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 = [
            'stripe/*',
        ];
    }
    

    【讨论】:

    • 正如我在问题上所说,我知道该属性,但我正在寻找一种在包中执行此操作的方法,因此我不必要求我的用户再做一件事安装我的包。
    猜你喜欢
    • 2015-03-11
    • 2015-08-03
    • 2018-06-12
    • 2020-12-10
    • 1970-01-01
    • 2022-12-18
    • 2011-10-22
    • 2016-02-16
    • 2019-09-01
    相关资源
    最近更新 更多