genealabs/laravel-caffeine

保持 Laravel 表单活跃


README

Travis Scrutinizer Coveralls GitHub (pre-)release Packagist

Caffeine for Laravel masthead image.

支持此包

这是一个 MIT 许可的开源项目,其持续发展得益于社区的资助。如果您想支持该项目以及我们的其他包,请考虑成为赞助者

我们感谢以下赞助者的慷慨。请花点时间了解一下他们

目标

防止在屏幕上留置一段时间后提交表单时表单超时。 (Laravel 默认为 120 分钟,但这是可配置的,并且可能因网站而异。)

实现

为了实现这一点,我们正在以固定间隔发送咖啡因滴(请求),以保持会话不超时。这仅在具有 _token 字段的页面上实现,因此所有其他页面将按正常方式超时。

原因

我选择这种方法来保持站点的安全性完整性,通过避免以下情况

  • 在未受保护的端点上暴露 CSRF 令牌。
  • 在特定路由或完全取消 CSRF 令牌验证。
  • 在所有页面上移除会话超时。

考虑

不兼容的包

  • Voyager 已报告为不兼容。为了解决这个问题,请配置 Caffeine 以在所有非 Voyager 路由上使用基于路由的中件间。请参阅下文中的配置和基于路由的中件间的实现细节。

路由

此包在 genealabs/laravel-caffeine 下添加了路由。

依赖项

您的项目必须满足以下条件

  • Laravel 8.0 或更高版本
  • PHP 7.3 或更高版本。

安装

composer require genealabs/laravel-caffeine

升级说明

如果您之前已注册了中件间,请从 app/Http/Kernel.php 中删除以下中件间

// protected $middleware = [
    GeneaLabs\LaravelCaffeine\Http\Middleware\LaravelCaffeineDripMiddleware::class,
// ];

0.6.0

此更新更改了配置文件设置名称。如果存在已发布的配置文件 config/genealabs-laravel-caffeine.php,请将其删除,并按照以下配置说明进行操作。

配置

return [
    /*
    |--------------------------------------------------------------------------
    | Drip Interval
    |--------------------------------------------------------------------------
    |
    | Here you may configure the interval with which Caffeine for Laravel
    | keeps the session alive. By default this is 5 minutes (expressed
    | in milliseconds). This needs to be shorter than your session
    | lifetime value configured set in "config/session.php".
    |
    | Default: 300000 (int)
    |
    */
    'drip-interval' => 300000,

    /*
    |--------------------------------------------------------------------------
    | Domain
    |--------------------------------------------------------------------------
    |
    | You may optionally configure a separate domain that you are running
    | Caffeine for Laravel on. This may be of interest if you have a
    | monitoring service that queries other apps. Setting this to
    | null will use the domain of the current application.
    |
    | Default: null (null|string)
    |
    */
    'domain' => null,

    /*
    |--------------------------------------------------------------------------
    | Drip Endpoint URL
    |--------------------------------------------------------------------------
    |
    | Sometimes you may wish to white-label your app and not expose the AJAX
    | request URLs as belonging to this package. To achieve that you can
    | rename the URL used for dripping caffeine into your application.
    |
    | Default: 'genealabs/laravel-caffeine/drip' (string)
    |
    */
    'route' => 'genealabs/laravel-caffeine/drip', // Customizable end-point URL

    /*
    |--------------------------------------------------------------------------
    | Checking for Lapsed Drips
    |--------------------------------------------------------------------------
    |
    | If the browser is put to sleep on (for example on mobile devices or
    | laptops), it will still cause an error when trying to submit the
    | form. To avoid this, we force-reload the form 2 minutes prior
    | to session time-out or later. Setting this setting to 0
    | will disable this check if you don't want to use it.
    |
    | Default: 2000 (int)
    |
    */
    'outdated-drip-check-interval' => 2000,

    /*
    |--------------------------------------------------------------------------
    | Use Route Middleware
    |--------------------------------------------------------------------------
    |
    | Drips are enabled via route middleware instead of global middleware.
    |
    | Default: false (bool)
    |
    */
    'use-route-middleware' => false,

];

只有需要自定义时才发布配置文件:

php artisan caffeine:publish --config

用法

就是这样!它将自动应用于找到具有 _token 字段的表单,或具有名为 "csrf-token" 的元标签,当浏览器中的页面打开时。

防止咖啡因化

有两种方法可以防止 Laravel 的咖啡因保持会话活跃:在 Blade 中禁用它,使用元标签方法,或者启用路由中件间模式,然后仅在路由或路由组上启用它。

元标签方法

如果您想防止某个页面使您的应用程序咖啡因化,请添加以下元标签

<meta name="caffeinated" content="false">

路由中件间方法

要启用此模式,您需要发布配置文件(请参阅上面的配置部分),然后将 use-route-middleware 设置为 true。这将禁用默认的全局中件间模式(它将应用于包含 CSRF 令牌的任何页面,贯穿整个应用程序)。现在您需要使用路由中件间选择性地在特定的路由或路由组上启用咖啡因。

Route::any('test', 'TestController@test')->middleware('caffeinated');

Route::group(['middleware' => ['caffeinated']], function () {
    Route::any('test', 'TestController@test');
})

您仍然可以使用路由中间件方法,并通过编辑 app/Http/Kernel.php 将其添加到 web 中间件组,以将其应用于所有路由。尽管如此,您只有在有非常具体的用例且无法利用默认的全局中间件选项时才应使用此选项。

这仅在有表单的页面上有效。如果没有,页面无论如何都不会使您的应用程序进入节能模式。

详细说明

对质量的承诺

在包开发过程中,我尽可能地采用良好的设计和开发实践,以确保此包尽可能出色。我的包开发清单包括

  • ✅ 使用单元测试尽可能达到接近 100% 的代码覆盖率。
  • ✅ 消除 SensioLabs Insight 和 Scrutinizer 识别的所有问题。
  • ✅ 完全符合 PSR1、PSR2 和 PSR4。
  • ✅ 包含 README.md 中的完整文档。
  • ✅ 提供符合 https://keepachangelog.com 格式的最新 CHANGELOG.md。
  • ✅ 所有代码中没有任何 PHPMD 或 PHPCS 警告。

贡献

请遵守和尊重包含的《行为准则》的各个方面 https://github.com/GeneaLabs/laravel-caffeine/blob/master/CODE_OF_CONDUCT.md

报告问题

在报告问题时,请尽可能完整地填写包含的模板。不完整的问题可能会被忽略或关闭,如果没有足够的信息供采取行动。

提交拉取请求

请审查《贡献指南》 https://github.com/GeneaLabs/laravel-caffeine/blob/master/CONTRIBUTING.md。只有符合所有标准的 PR 才会被接受。

❤️ 开源软件 - 给 ⭐️

我们已将出色的 symfony/thanks composer 包作为开发依赖项包含在内。通过为使用的包添加星标来让您的 OS 包维护者知道您感谢他们。安装此包后,只需运行 composer thanks 即可。(不必担心,由于它是开发依赖项,它不会安装到您的实时环境中。)