coderflex / filament-turnstile
Filament 插件,帮助您无缝集成 Cloudflare Turnstile
Requires
- php: ^8.1
- coderflex/laravel-turnstile: ^1.0|^2.0
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- filament/filament: ^3.0
- larastan/larastan: ^2.0.1
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.9|^8.1
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- pestphp/pest-plugin-livewire: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
README
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 控制台获取 SiteKey
和 SecretKey
。
有关详细说明,请参阅文档。
生成密钥后,使用以下格式将它们包含在您的 .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)。请参阅 许可证文件 获取更多信息。