验证码
验证码
验证码,英文单词为 CAPTCHA,它是 Completely Automated Public Turing test to tell Computers and Humans Apart 的英文缩写,中文翻译为: 全自动区分计算机和人类的公开图灵测试,是一种区分用户是机器或人类的公共全自动程序。
在 CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于机器无法解答 CAPTCHA 的问题,回答出问题的用户即可视为人类。
Yii2 的基础应用模板和高级应用模板都提供了简单的,开箱即用的图形验证码的示例代码。
基本流程
使用 Yii2 的验证码,一般包括以下步骤:
- 覆盖
\yii\web\Controller::actions()
方法,然后用 ID ‘captcha’ 注册yii\captcha\CaptchaAction
类的一个动作; - 在表单模型中,声明一个属性来存储用户输入的验证代码,并声明由 ‘captcha’ 验证器验证的属性;
- 在控制器视图中,在表单中插入一个
yii\captcha\Captcha
小部件。
注意:验证码包中的
yii\captcha\CaptchaAction
需要 GD2 或 ImageMagick 的 PHP 扩展。
Captcha 动作
yii\captcha\CaptchaAction
负责渲染一个 CAPTCHA 图像。它一般与 yii\captcha\Captcha
和 yii\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 页面,效果如下:
如图所示,我们可以看到在控制器设置的验证码,已经出现在页面上,具体如何在前端渲染出来的,我们接着看下一节。
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