shiftonelabs/laravel-cors

在全局或按路由级别为Laravel应用启用CORS。

1.0.1 2019-12-21 00:27 UTC

This package is auto-updated.

Last update: 2024-09-21 21:01:42 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

这个Laravel包提供了在Laravel应用程序中启用CORS请求的支持。如果需要基本CORS支持,还有两个其他流行的包被广泛使用(barryvdh/laravel-corsspatie/laravel-cors)。

这个包试图解决其他包的一些问题。这些问题不是致命的,所以如果您不关心这些问题,可能需要查看其他包。

1. 多配置

虽然其他包支持将CORS中间件应用于特定路由,但它们仍然只支持一个全局配置。因此,例如,如果您希望一组路由仅对一个源可用,而另一组路由对不同的源可用,则无法创建这样的配置而不使这两组路由都对两个源可用。

这个包允许指定多个配置,可以根据需要按路由应用。

2. 错误处理

在其他包中,如果在应用CORS中间件之前发生错误,则不会将CORS头添加到错误响应中。在这种情况下,您不会收到带有错误的响应,而是会收到无效的CORS请求错误,并且无法访问响应。

这个包确保即使在发生错误的情况下,也会应用CORS配置到请求中。

3. 预检问题

  • 响应状态码 - 两个包都为拒绝的预检请求返回4xx状态码。预检请求应返回2xx状态码,只是需要正确设置(或未设置)CORS响应头。这个包为所有预检请求返回204无内容响应。

  • 响应头 - 两个包不设置任何拒绝的预检请求的头。对于无效的源来说这是合适的,但如果预检因为方法或头而被拒绝,则应该添加适当的响应头,以便客户端确定正确的拒绝原因。如果没有响应头,所有拒绝原因都将归因于无效的源。这个包试图根据拒绝场景智能地设置响应头。

版本

这个包适用于Laravel 5.1至Laravel 6.x。它目前不支持Lumen。这个包使用中间件,因此不支持Laravel < 5.0。这个包需要Kernel::hasMiddleware()方法,因此不支持Laravel 5.0。

安装

通过Composer

$ composer require shiftonelabs/laravel-cors

一旦更新了composer并安装了包,就需要加载服务提供者。

Laravel 5.5+, 6.x (5.5, 5.6, 5.7, 5.8, 6.x)

这个包使用自动包发现。服务提供者将自动注册。

Laravel 5.1 - 5.4

打开config/app.php并在提供者数组中添加以下行

ShiftOneLabs\LaravelCors\LaravelCorsServiceProvider::class,

配置

这个包包含一个默认的配置文件,可以发布以对其进行修改。

php artisan vendor:publish --provider="ShiftOneLabs\LaravelCors\LaravelCorsServiceProvider" --tag="config"

这将发布配置文件到 config/cors.php。修改此配置文件以更改默认配置文件并添加新的自定义配置文件。

用法

全局中间件

要应用全局 CORS 政策,将 \ShiftOneLabs\LaravelCors\Http\Middleware\ApplyCorsPolicy 中间件添加到 app/Http/Kernel.php 文件中的全局 $middleware 属性。此全局 CORS 政策将使用在 cors.php 配置文件中定义的默认配置文件中的配置文件。默认情况下,这是一个开放的策略,将允许所有 CORS 请求。

protected $middleware = [
    /* ... */,
    \ShiftOneLabs\LaravelCors\Http\Middleware\ApplyCorsPolicy::class,
]

路由中间件

要应用特定路由的 CORS 政策,首先在 app/Http/Kernel.php 文件中将策略中间件的别名添加到 $routeMiddleware 属性中。

protected $routeMiddleware = [
    /* ... */,
    'cors.policy' => \ShiftOneLabs\LaravelCors\Http\Middleware\ApplyCorsPolicy::class,
]

现在,您可以将此中间件添加到任何路由或路由组。此外,此路由中间件可以接受一个参数,以指定在 cors.php 配置文件中定义的 CORS 配置文件。

假设您已将以下配置文件添加到配置文件中

    'profiles' => [
        /* ... */,

        // add a new CORS profile named "app1"
        'app1' => [
            'allowedMethods' => ['*'],
            'allowedOrigins' => ['example.com'],
            'allowedOriginsPatterns' => [],
            'allowedHeaders' => ['*'],
            'exposedHeaders' => [],
            'maxAge' => 0,
            'supportsCredentials' => false,
        ],
    ],

您可以使用路由中间件将此新的 CORS 配置文件应用到任何路由或路由组

Route::get('example-route', 'ExampleController@index')->middleware('cors.policy:app1');

现在,此路由将仅允许来自 example.com 的 CORS 请求。来自其他来源的 CORS 请求将被拒绝。

多个中间件

请求可能需要通过多个定义的策略。例如,如果您有一个全局 CORS 策略、一个组中间件策略和一个特定路由策略,则请求必须通过所有三个策略的要求。

如果请求失败,将使用最不具体(全局)到最具体(路由)的第一个失败策略构建响应头。

如果请求成功,将使用请求通过的最后策略构建响应头。

贡献

欢迎贡献。请参阅 CONTRIBUTING 以获取详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 patrick@shiftonelabs.com 而不是使用问题跟踪器。

替代方案

  • barryvdh/laravel-cors:为 Laravel/Lumen 应用添加 CORS 支持的最受欢迎的包之一。如果您需要简单的支持,请选择此包。
  • spatie/laravel-cors:社区中知名的包提供商的另一个 Laravel/Lumen CORS 实现。此包比 barryvdh/laravel-cors 包提供了更多的灵活性。

致谢

许可

MIT 许可证(MIT)。请参阅 许可文件 以获取更多信息。