TP6----验证码

2020-09-08  本文已影响0人  JuMinggniMuJ

tp6的验证码是通过password_hash加密,通过session存储的一个验证方式

1.开启session:

tp5的session是默认开启的,但是tp6却不是,如果我们上来直接使用验证码,那么无论如何是验证不成功的,所以我们首先需要开启session才能使用验证码这个功能。

1.打开app目录下的middleware.php
2.取消\think\middleware\SessionInit::class的注释
2.下载验证码:

tp6默认是没有think-captcha扩展的,需要我们手动下载使用

composer require topthink/think-captcha

默认会下载下来最新的版本,我用的验证码版本是v3.0.3

3.修改验证码配置:

使用composer下载下来的验证码扩展会自动在config文件夹下为我们生成captcha.php文件,我们只需要修改相应的配置即可:

return [
   //验证码位数
   'length'   => 4,
   // 验证码字符集合
   'codeSet'  => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',
   // 验证码过期时间
   'expire'   => 1800,
   // 是否使用中文验证码
   'useZh'    => false,
   // 是否使用算术验证码
   'math'     => true,
   // 是否使用背景图
   'useImgBg' => true,
   //验证码字符大小
   'fontSize' => 25,
   // 是否使用混淆曲线
   'useCurve' => false,
   //是否添加杂点
   'useNoise' => false,
   // 验证码字体 不设置则随机
   'fontttf'  => '',
   //背景颜色
   'bg'       => [243, 251, 254],
   // 验证码图片高度
   'imageH'   => 0,
   // 验证码图片宽度
   'imageW'   => 0,
];
4.使用验证码:

配置完验证码之后我们就可以在页面中使用验证码,文档中验证码有两种使用方式:

1.直接生成验证码的图片html:
        {:captcha_img()}
2.生成验证码的图片地址:
        <img src="{:captcha_src()}" />

个人建议使用第二种,可以随意的更改验证码的样式,而第一种修改起来比较麻烦

5.验证验证码:

我们需要在控制器中接收页面传来的验证码

$captcha = input('captcha');
if( !captcha_check($captcha )){
    return '验证码错误';
}else{
      return '验证码正确';
}
6.页面点击刷新功能:

有的时候我们看不清验证码中的信息,就需要我们做一个点击刷新验证码的功能,其实captcha扩展中已经给了我们建议写法:

/**
 * @param $config
 * @return string
 */
function captcha_src($config = null): string{
    return Route::buildUrl('/captcha' . ($config ? "/{$config}" : ''));
}
/**
 * @param $id
 * @return string
 */
function captcha_img($id = '', $domid = ''): string{
    $src = captcha_src($id);
    $domid = empty($domid) ? $domid : "id='" . $domid . "'";
    return "<img src='{$src}' alt='captcha' " . $domid . " onclick='this.src=\"{$src}?\"+Math.random();' />";
}

我们只需要在页面中给验证码图片添加一个点击事件:

<img src="{:captcha_src()}" onclick="this.src = this.src + '?a='+Math.random()" />
7.验证码是怎么验证的:

我们在验证验证码是否正确的时候只需要在控制器中调用captcha_check方法,但是到底是怎么验证的呐?

1.captcha_check方法(think-captcha/src/helper.php)
        function captcha_check($value){
            return Captcha::check($value);
        }
        1.1.它只是静态调用了一下Captcha类中的check方法
2.check方法(think-captcha/src/Captcha.php)
        public function check(string $code): bool{
            if (!$this->session->has('captcha')) {
            return false;
            }
            $key = $this->session->get('captcha.key');
            $code = mb_strtolower($code, 'UTF-8');
            $res = password_verify($code, $key);
            if ($res) {
                $this->session->delete('captcha');
            }
            return $res;
        }
        2.1首先判断session中是否有验证码信息,没有直接返回false
        2.2如果存在获取缓存中的验证码信息
        2.3将我们输入的验证码全部转化为小写
        2.4使用password_verify函数校验验证码
        2.5如果校验成功删除session中的验证码信息
8.至此tp6中使用验证码测试完成
上一篇 下一篇

猜你喜欢

热点阅读