aryehraber/statamic-captcha

使用验证码服务保护Statamic表单

资助包维护!
aryehraber

安装量: 128,541

依赖项: 0

建议者: 0

安全性: 0

星星: 11

关注者: 2

分支: 8

开放问题: 3

类型:statamic-addon

v1.13.0 2024-09-07 19:47 UTC

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文档sitekeysecret,以及您希望保护的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;
        }
    }
}