aryehraber / statamic-captcha
使用验证码服务保护Statamic表单
Requires
- statamic/cms: ^3.0 || ^4.0 || ^5.0
README
使用验证码服务保护Statamic表单。
此插件允许您使用以下任何一种服务来保护Statamic表单
初始设置完成后,您只需在表单内添加{{ captcha }}
标签即可,非常简单!
安装
通过composer安装插件
composer require aryehraber/statamic-captcha
发布配置文件
php please vendor:publish --tag=captcha-config
或者,您可以在项目的config
目录内手动创建captcha.php
文件来设置配置文件
<?php return [ 'service' => 'Recaptcha', // options: Recaptcha / Hcaptcha / Turnstile / Altcha 'sitekey' => env('CAPTCHA_SITEKEY', ''), 'secret' => env('CAPTCHA_SECRET', ''), 'forms' => [], 'user_login' => false, 'user_registration' => false, 'disclaimer' => '', 'invisible' => false, 'hide_badge' => false, 'enable_api_routes' => false, 'custom_should_verify' => null, ];
一旦配置文件就位,请确保添加来自Recaptcha控制台、hCaptcha控制台、Cloudflare仪表板或Altcha文档的sitekey
和secret
,以及您希望保护的Statamic表单的处理程序
<?php return [ 'service' => 'Recaptcha', // options: Recaptcha / Hcaptcha / Turnstile / Altcha 'sitekey' => 'YOUR_SITEKEY_HERE', // Or add to .env 'secret' => 'YOUR_SECRET_HERE', // Or add to .env 'forms' => ['contact', 'newsletter'], // ... ];
如果您希望验证所有表单而不必在forms
配置数组中指定每个表单,您可以使用all
选项。
注意:这应该替换数组并设置为字符串。
<?php return [ 'forms' => 'all', // ... ];
使用方法
<head> <title>My Awesome Site</title> {{ captcha:head }} </head> <body> {{ form:contact }} <!-- Add your fields like normal --> {{ captcha }} {{ if error:captcha }} <p>{{ error:captcha }}</p> {{ /if }} {{ /form:contact }} </body>
这将在页面上自动渲染验证码元素。表单提交后,插件将暂时阻止表单保存,同时验证码服务验证请求。如果一切正常,表单将正常保存,否则将在{{ errors }}
对象中添加错误。
隐形验证码
只需在验证码的配置中将invisible
设置为true
(Turnstile通过Cloudflare仪表板处理隐形功能,因此无需更改验证码配置)。要隐藏粘性的Recaptcha徽章,请确保也将hide_badge
设置为true
。
注意:使用隐形验证码需要在表单下方显示验证码服务的条款链接,为了简化,可以使用{{ captcha:disclaimer }}
。此消息可以使用验证码配置中的disclaimer
选项进行自定义,但已添加了一些合理的默认设置,这些设置将根据您使用的验证码服务自动切换。
用户注册与登录
验证码还可以验证用户注册和用户登录表单请求,只需在验证码配置中将user_registration
/ user_login
设置为true
,并在Statamic的{{ user:register_form }}
/ {{ user:login_form }}
标签内使用{{ captcha }}
标签即可。
数据属性
一些验证码服务通过数据属性提供额外的功能,例如浅色/深色模式和尺寸选项。这些可以简单地添加到验证码标签中,并将传递到客户端小部件。
{{ captcha data-theme="dark" data-size="compact" }}
翻译
本包已本地化为英语和德语。如果您需要其他语言的翻译,您可以自行创建。
- 在
resources/lang/vendor/statamic-captcha/{language}/messages.php
中创建翻译文件。 - 您可以将英语翻译文件作为模板。
- 欢迎您通过提交PR分享您的翻译。
如果您想更改现有的消息,您可以发布并覆盖它们。
php please vendor:publish --tag="captcha-translations"
高级
自定义“是否验证”逻辑
您可以通过自定义可调用的类提供额外的自定义逻辑,以确定是否尝试使用自定义验证。这对于调整Captcha的shouldVerify
检查以包含特定于应用程序的行为很有用,例如:仅对访客用户强制执行Captcha,而对于已登录用户则绕过。
要开始,在您的应用程序中创建一个可调用的类,并将其作为custom_should_verify
属性添加到您的配置中。
<?php return [ // ... 'custom_should_verify' => \App\Support\MyCustomShouldVerify::class, ];
此可调用的类必须实现\AryehRaber\Captcha\Contracts\CustomShouldVerify
接口,该接口强制在invoke方法中传递一个事件参数,并随后返回一个可选的布尔值。为了阻止Captcha的shouldVerify
方法被调用,invoke方法必须返回false
,否则返回true
(或null
)将继续Captcha的验证逻辑。
注意:此自定义类是通过Laravel的容器解析的,这意味着可以通过构造函数进行依赖注入。
<?php namespace App\Support; use AryehRaber\Captcha\Contracts\CustomShouldVerify; class MyCustomShouldVerify implements CustomShouldVerify { public function __invoke($event): ?bool { // bypass verification for authenticated users if (auth()->check()) { return false; } // bypass verification on dev environment if (app()->environment('dev')) { return false; } // bypass verification based on event form submission if ($event instanceof \Statamic\Events\FormSubmitted) { // return $event->submission; } // bypass verification based on login event if ($event instanceof \Illuminate\Auth\Events\Login) { // return $event->user; } // bypass verification based on user registration event if ($event instanceof \Statamic\Events\UserRegistering) { // return $event->user; } // bypass verification based on entry saving event if ($event instanceof \Statamic\Events\EntrySaving) { // return $event->entry; } } }