验证码

未匹配的标注

验证码

验证码,英文单词为 CAPTCHA,它是 Completely Automated Public Turing test to tell Computers and Humans Apart 的英文缩写,中文翻译为: 全自动区分计算机和人类的公开图灵测试,是一种区分用户是机器或人类的公共全自动程序。

在 CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于机器无法解答 CAPTCHA 的问题,回答出问题的用户即可视为人类。

Yii2 的基础应用模板和高级应用模板都提供了简单的,开箱即用的图形验证码的示例代码。

基本流程

使用 Yii2 的验证码,一般包括以下步骤:

  1. 覆盖 \yii\web\Controller::actions() 方法,然后用 ID ‘captcha’ 注册 yii\captcha\CaptchaAction 类的一个动作;
  2. 在表单模型中,声明一个属性来存储用户输入的验证代码,并声明由 ‘captcha’ 验证器验证的属性;
  3. 在控制器视图中,在表单中插入一个 yii\captcha\Captcha 小部件。

注意:验证码包中的 yii\captcha\CaptchaAction 需要 GD2 或 ImageMagick 的 PHP 扩展。

Captcha 动作

yii\captcha\CaptchaAction 负责渲染一个 CAPTCHA 图像。它一般与 yii\captcha\Captchayii\Captcha\CaptchaValidator 一起使用来提供验证码功能。

通过配置 yii\captcha\CaptchaAction 的属性,您可以定制生成的 CAPTCHA 图像的外观,例如字体颜色、背景颜色等。

在高级应用模板中的 frontend 应用中的 SiteController 控制器中的 actions() 方法中,代码如下:

namespace frontend\controllers;

use Yii;
use yii\web\Controller;

class SiteController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',

                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, //测试时开启的固定验证码
                'testLimit' => 3, //相同验证码应显示次数,小于或等于0的值表示测试是无限的

                'width' => 120, //宽度
                'height' => 50, //高度
                'padding' => 2, //间距
                'backColor' => 0xFFFFFF, //背景色
                'foreColor' => 0x2040A0, //字色
                'transparent' => false, //是否使用透明背景
                'maxLength' => 6, //随机生成的验证码字最大长度
                'minLength' => 4, //随机生成的验证码字最小长度
                'offset' => 2, //字符之间的偏移量
                'fontFile' => '@yii/captcha/SpicyRice.ttf', //设置字体文件
                //'imageLibrary' => 'gd', //要使用的渲染库,目前只支持'gd'和'imagick'
            ],
        ];
    }
}

问你可以方法应用模板的示例 Contact 页面,效果如下:

Contact 页面

如图所示,我们可以看到在控制器设置的验证码,已经出现在页面上,具体如何在前端渲染出来的,我们接着看下一节。

Captcha 小部件

yii\captcha\Captcha 类呈现一个 CAPTCHA 图像和一个输入字段,该字段接受用户输入的验证码。它一般被用于与 yii\captcha\CaptchaAction 一起工作,来提供 CAPTCHA,可以有效防止网站垃圾邮件注册。

yii\captcha\Captcha 渲染的图像元素(<img />)将显示一个 Captcha 图像,它是由 captchaAction 指定的路由动作生成的。该动作必须是 yii\captcha\CaptchaAction 的实例。

您可以这样使用这个带有 model 属性的验证码小部件,具体代码如下:

echo Captcha::widget([
    'model' => $model,
    'attribute' => 'captcha',
]);

您也可以使用 name 属性来做代替方案,具体如下:

echo Captcha::widget([
    'name' => 'captcha',
]);

你也可以在 yii\widgets\ActiveForm 中使用 yii\widgets\ActiveField::widget() 方法,来使用这个验证码小部件,就像上一节中的 contact 视图页面中,具体示例如下:

use yii\captcha\Captcha;

<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
    'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>

当用户点击这个 CAPTCHA 图像时,它将导致这个 CAPTCHA 图像被一个新的 CAPTCHA 刷新。

Captcha 验证器

\yii\captcha\CaptchaValidator 验证器,负责验证属性值是否与 CAPTCHA 中显示的验证码相同。它一般要与 \yii\captcha\CaptchaAction 搭配一起使用。

在应用模板示例代码中,我们可以看到 Captcha 验证器的使用,具体如下:

namespace frontend\models;

use Yii;
use yii\base\Model;

class ContactForm extends Model
{
    public $verifyCode;

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            // verifyCode 需要正确输入
            ['verifyCode', 'captcha', 'message' => '验证码错误'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
           return [
            'verifyCode' => '验证码',
        ];
    }
}

注意:一旦 CAPTCHA 验证成功,一个新的 CAPTCHA 将自动生成。因此,CAPTCHA 验证不应该在 AJAX 验证模式中使用,因为即使用户输入了与 CAPTCHA 图像中显示的相同的代码(实际上与最新的CAPTCHA代码不同),验证也可能失败。

💖喜欢本文档的,欢迎点赞、收藏、留言或转发,谢谢支持!
作者邮箱:zhuzixian520@126.com,github地址:github.com/zhuzixian520

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
zhuzixian520
讨论数量: 0
发起讨论 只看当前版本


暂无话题~