coderflex/filament-turnstile

Filament 插件,帮助您无缝集成 Cloudflare Turnstile

v2.2.0 2024-05-04 13:23 UTC

This package is auto-updated.

Last update: 2024-08-29 06:50:47 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads


Login Screen screenshot


Filament Turnstile 是一款插件,旨在将 Cloudflare 的 turnstile 无缝集成到您的应用中。

此插件底层使用 Laravel Turnstile。有关详细信息,请查阅 Laravel Turnstile README

安装

使用 Composer 安装包

composer require coderflex/filament-turnstile

对于仍在使用 Filament V2 的用户,使用以下命令安装包

composer require coderflex/filament-turnstil "^1.0"

turnstile 密钥

要使用 Cloudflare Turnstile,请从您的 Cloudflare 控制台获取 SiteKeySecretKey

有关详细说明,请参阅文档

生成密钥后,使用以下格式将它们包含在您的 .env 文件中

TURNSTILE_SITE_KEY=1x00000000000000000000AA
TURNSTILE_SECRET_KEY=1x0000000000000000000000000000000AA

出于测试目的,您可以使用 Cloudflare 提供的虚拟站点密钥和密钥

使用方法

使用此插件非常简单。在您的表单中,包含以下代码

use Coderflex\FilamentTurnstile\Forms\Components\Turnstile;

Turnstile::make('captcha')
    ->theme('auto') // accepts light, dark, auto
    ->language('en-US') // see below
    ->size('normal'), // accepts normal, compact

有关受支持语言的列表,请参阅受支持语言部分

Turnstile 字段提供各种选项;您可以在 Cloudflare 配置部分 中了解更多信息。

turnstile 事件

turnstile 包提供了您可以在各种场景中管理的 captcha 行为的事件。

重置事件

reset-captcha 事件允许您以编程方式重置 captcha 挑战。这在以下情况下非常有用:

  • 在成功提交表单后清除挑战: 这确保为下一个用户提供新鲜的 captcha。
  • 在验证错误时重置挑战: 防止用户在表单提交过程中遇到错误后卡在之前已解决的 captcha 上。

分发重置事件

分发 reset-captcha 事件有两种主要方式

1. 使用 onValidationError 方法

Filament 在您的表单的 Livewire 组件中提供了 onValidationError 方法。每当表单验证失败 时,该方法会自动触发。以下是如何使用它

protected function onValidationError(ValidationException $exception): void
{
    $this->dispatch('reset-captcha');

    // Perform additional actions as necessary (e.g., display error messages)
}

在此示例中,在验证错误时分发 reset-captcha 事件,确保为用户的下一次尝试重置 captcha。

2. 手动分发

对于与重置 captcha 无直接关联的场景,您可以使用 Filament 的事件分发器手动分发事件

$this->dispatch('reset-captcha');

在登录页面中使用重置事件

要自动在您的登录表单的 Livewire 组件中重置 captcha,使用 throwFailureValidationException 方法

protected function authenticate(): void
{
    // Perform authentication logic
    // ...

    if (! Auth::attempt($this->data)) {
        $this->throwFailureValidationException(
            [
                'email' => 'Invalid email or password.',
            ]
        );
    }

    // Redirect to success page or perform other actions
}

通过抛出带有适当错误信息的验证异常,您将触发 onValidationError 方法,进而分发 reset-captcha 事件,有效地为下一次登录尝试重置 captcha。

真实示例

在 Filament 中实现 闸机 验证码并应用于 登录 页面,请按照以下步骤操作

创建一个新的 App/Filament/Pages/Auth/Login.php

namespace App\Filament\Pages\Auth;

use Coderflex\FilamentTurnstile\Forms\Components\Turnstile;
use Filament\Forms\Form;
use Filament\Http\Responses\Auth\Contracts\LoginResponse;
use Filament\Pages\Auth\Login as AuthLogin;

class Login extends AuthLogin
{
    /**
     * @return array<int|string, string|Form>
     */
    protected function getForms(): array
    {
        return [
            'form' => $this->form(
                $this->makeForm()
                    ->schema([
                        $this->getEmailFormComponent(),
                        $this->getPasswordFormComponent(),
                        $this->getRememberFormComponent(),
                        Turnstile::make('captcha')
                            ->label('Captcha')
                            ->theme('auto'),
                    ])
                    ->statePath('data'),
            ),
        ];
    }

    // if you want to reset the captcha in case of validation error
    protected function throwFailureValidationException(): never
    {
        $this->dispatch('reset-captcha');

        parent::throwFailureValidationException();
    }
}

然后,覆盖你自己的 PanelProvider 中的 login() 方法(例如,AdminPanelProvider

namespace App\Providers\Filament;

use App\Filament\Auth\Login;
use Filament\Panel;
use Filament\PanelProvider;

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->default()
            ->id('admin')
            ->path('admin')
            ->login(Login::class); // override the login page class.
            ...
    }
}

测试

composer test

更新日志

请参阅 更新日志 了解最近的变化信息。

贡献

请参阅 贡献指南 获取详细信息。

安全漏洞

请查阅 我们的安全策略 了解如何报告安全漏洞。

致谢

许可证

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