e盾网络验证源码_Laravel [mews/captcha] 图片验证码

1 安装配置

1.1 使用 composer 安装 [mews/captcha] 扩展

composer require mews/captcha
项目根目录 composer.json -> require 会新增一行(我的 laravel 版本是 5.6)
"mews/captcha": "^3.0"

1.2 config/app.php 添加相应代码

'providers'=>[    // ...    Mews\Captcha\CaptchaServiceProvider::class]'aliases'=>[    // ...    'Captcha' => Mews\Captcha\Facades\Captcha::class]

1.3 发布配置文件(不发布即使用默认配置)

// 生成 config/captcha.php 文件php artisan vendor:publish

1.4 (可选)配置自己的验证码

return [    // 生成的验证码字符集    'characters' => ['2', '3', '4', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'm', 'n', 'p', 'q', 'r', 't', 'u', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'X', 'Y', 'Z'],    'default' => [        'length' => 4,      // 验证码字符长度        'width' => 160,     // 图片宽度        'height' => 46,     // 图片高度        'quality' => 90,    // 图片质量        'math' => false,    // 数学规则        'expire' => 60,     // 过期时间    ],    // ...]

2 生成验证码

2.1 Return Image

return captcha();// orCaptcha::create();

返回如下:

7a828ba4c240698ab9ac74ce59dedaef.png

看一下源码,这里我加了整体的逻辑注释,详细的内部方法实现可以访问项目内的 /vendor/mews/captcha/src/Captcha.php

/** * Create captcha image * * @param string $config * @param bool $api * @return array|mixed * @throws Exception */public function create(string $config = 'default', bool $api = false){    $this->backgrounds = $this->files->files(__DIR__ . '/../assets/backgrounds');   // 背景图片文件    $this->fonts = $this->files->files($this->fontsDirectory);  // 字体文件    // 根据不同的 laravel 版本配置字体文件路径    if (version_compare(app()->version(), '5.5.0', '>=')) {        $this->fonts = array_map(function ($file) {            /* @var File $file */            return $file->getPathName();        }, $this->fonts);    }    $this->fonts = array_values($this->fonts); //reset fonts array index    // 加载 config/captcha.php 的配置项    $this->configure($config);    $generator = $this->generate();     // 生成验证码文本,并session存储    $this->text = $generator['value'];    // 根据配置,创建验证码图片    $this->canvas = $this->imageManager->canvas(        $this->width,        $this->height,        $this->bgColor    );    if ($this->bgImage) {        $this->image = $this->imageManager->make($this->background())->resize(            $this->width,            $this->height        );        $this->canvas->insert($this->image);    } else {        $this->image = $this->canvas;    }    if ($this->contrast != 0) {        $this->image->contrast($this->contrast);    }    $this->text();  // 将文本写入图片    $this->lines(); // 添加干扰线    if ($this->sharpen) {        $this->image->sharpen($this->sharpen);  // 图片锐化    }    if ($this->invert) {        $this->image->invert();     // 应该是对文本进行颠倒处理    }    if ($this->blur) {        $this->image->blur($this->blur);    // 模糊    }    if ($api) {        Cache::put('captcha_record_' . $generator['key'], $generator['value'], $this->expire);  // 缓存    }    // 如果 $api 是 true,则返回二进制编码格式;如果是 false,则直接输出一张图片    return $api ? [        'sensitive' => $generator['sensitive'],        'key' => $generator['key'],        'img' => $this->image->encode('data-url')->encoded    ] : $this->image->response('png', $this->quality);}

2.2 Return URL

返回 url 地址

captcha_src();// orCaptcha::src('default');

源码如下:

/** * Generate captcha image source * * @param string $config * @return string */public function src(string $config = 'default'): string{    return url('captcha/' . $config) . '?' . $this->str->random(8);}

2.3 Return HTML

返回一个携带 src 的 img 标签

captcha_img();// orCaptcha::img();

源码如下:

/** * Generate captcha image html tag * * @param string $config * @param array $attrs * $attrs -> HTML attributes supplied to the image tag where key is the attribute and the value is the attribute value * @return string */public function img(string $config = 'default', array $attrs = []): string{    $attrs_str = '';    foreach ($attrs as $attr => $value) {        if ($attr == 'src') {            //Neglect src attribute            continue;        }        $attrs_str .= $attr . '="' . $value . '" ';    }    return new HtmlString('');}

3 验证 : 使用 laravel validatesRequest

3.1 session 模式(代码来自官方文档)

// [your site path]/Http/routes.phpRoute::any('captcha-test', function() {    if (request()->getMethod() == 'POST') {        $rules = ['captcha' => 'required|captcha'];        $validator = validator()->make(request()->all(), $rules);        if ($validator->fails()) {            echo '

Incorrect!

'; } else { echo '

Matched :)

'; } } $form = ''; $form .= ''; $form .= '

' . captcha_img() . '

'; $form .= ' $form .= '

Check

'; $form .= ''; return $form;});

3.2 无状态模式 : 当你从请求网址拿到 key 和 img,可以使用下面方法来验证(代码来自官方文档)

//key is the one that you got from json response// fix validator// $rules = ['captcha' => 'required|captcha_api:'. request('key')];$rules = ['captcha' => 'required|captcha_api:'. request('key') . ',default'];$validator = validator()->make(request()->all(), $rules);if ($validator->fails()) {    return response()->json([        'message' => 'invalid captcha',    ]);} else {    //do the job}

这里我们追一下 check_api() 方法,还是在 captcha.php 里:

/** * Captcha check * * @param string $value * @param string $key * @param string $config * @return bool */public function check_api($value, $key, $config = 'default'): bool{    // pull : 从缓存中获取并删除    if (!Cache::pull('captcha_record_' . $key)) {        return false;    }    // 加载 config/captcha.php 的配置项    $this->configure($config);    if($this->encrypt) $key = Crypt::decrypt($key);   // 如果加密就解密    return $this->hasher->check($value, $key);  // 返回 hash 验证结果,使用 password_verify() 函数,如果未输入,则直接返回 false}

官方 packagist 文档: https://packagist.org/packages/mews/captcha

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源工具Arena,数据科学家再也不用为Kubernetes犯难啦!

摘要: 为什么要用Kubernetes去难为数据科学家呢? 2018年7月,阿里云将深度学习工具Arena贡献给了开源社区,数据科学家无需学习底层IT资源使用,即可在云端运行深度学习,一分钟内启动深度学习任务&#xff0c…

mysql时间模糊查询_mysql中那些根据时间查询的sql语句

在我们使用mysql是免不了要根据时间去查询一些数据,这个时候一般有几种方式可以去查询。第一种数据库,如果有数据新建时间可以以这个时间为节点,通过当前时间条件去比较时间来查询到此段时间内的数据例如:这个是可传参数的SELECT …

专访阿里数据库备份专家 教你pick最有效的备份系统

摘要: 数据库备份是个老生常谈的话题,看似很简单,但在实际操作过程中,运维人员往往会遇到这样或那样的坑。那么,如今的数据库备份有哪些挑战?如何构建有效备份系统?有什么解决办法? …

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(静默创建实例_08)

接上一篇:linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(执行安装_07) 创建ORACLE实例前提,准备下面7项工作 序号说明链接①安装操作系统https://blog.csdn.net/weixin_40816738/article/details/104454497②安装常用工…

当我们在聊 Serverless 时你应该知道这些 | CSDN博文精选

戳蓝字“CSDN云计算”关注我们哦!作者 | 杨泽强(竹涧)转自 | CSDN企业博客责编 | 阿秃说起当前最火的技术,除了最新的区块链、AI,还有一个不得不提的概念是 Serverless。Serverless 作为一种新型的互联网架…

androidbyte数组使用_android byte的用法

byte 为有符号数据,引用文章android byte的使用暴走邻家 2018-01-24 08:55:07 10333 收藏 4分类专栏: android Android基础 文章标签: android app java byte 函数版权今天,简单讲讲android里byte的使用。这个其实很简单&#xff…

Apache RocketMQ 正式开源分布式事务消息

摘要: 近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消息,而且实现…

如何使用阿里云ARMS诊断Java服务端报错问题

摘要: 这是ARMS团队推出的“网站常见问题1分钟定位系列篇”第二文。 我的网站为什么一错再错 网页报错,尤其是5XX错误是互联网应用最常见的问题之一。5XX错误通常发生于服务端。服务端是业务逻辑最复杂,也是整条网络请求链路中最容易出错、出…

.iml文件_jetbrains误删maven 项目.iml文件后的处理方法

jetbrains 打开maven项目, 出现如下提示这个时候打开 Terminal在提示符下输入:mvn idea:module 回车运行,就可以修复。Relationship between .iml file and pom.xml fileThe intelliJ idea doesnt understand the maven project model (POM.x…

亚马逊消费者业务宣布永久关闭 Oracle 数据库,去O新进展;华为发布最新5G全系列解决方案;苹果正研究新设备“智能戒指”……...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

vs未能找到程序集platform.winmd_PP体育直播大连人VS恒大:新老8冠王首尾对决竟有十大看点...

北京时间8月25日,中超大连赛区的第7轮较量,广州恒大迎战大连人,恒大取胜即可继续位列榜首,同时获得半程冠军。而对于前6轮不胜的大连人来说,已经被逼上了绝境。虽然大连人晋级争冠组的前景极为渺茫,但一胜难…

Sentinel如何通过限流实现服务的高可用性

摘要: 在复杂的生产环境下可能部署着成千上万的服务实例,当流量持续不断地涌入,服务之间相互调用频率陡增时,会产生系统负载过高、网络延迟等一系列问题,从而导致某些服务不可用。如果不进行相应的流量控制&#xff0c…

京信通信:数据智能为生产调试“增效瘦身”

摘要: “数据驱动测试优化,突破自动测试边界,赋能智慧测试新模式。”——京信智能制造副总经理葛鑫 “进入车间,映入眼帘的是一条长约20 米的 O 型生产线,产线前三名工人和几个机器人正协同工作,将各种元器…

c++代码好玩_一行Python代码能干嘛?快来看看吧!有表白利器哦

python有很多优雅有趣的代码写法,同时还很简短,以至于当我刚开始接触这个编程语言的时候,就爱不释手。而前几天的编程语言榜单中python也超越了java成为了第一,挺替python开心的。python到底有多有趣呢?一行代码告诉你…

探秘HDFS —— 发展历史、核心概念、架构、工作机制 (上)| 博文精选

戳蓝字“CSDN云计算”关注我们哦!作者 | Mr-Bruce转自 | CSDN博客责编 | 阿秃几周前,笔者做了一个与HDFS有关的技术分享,以知识普及为目的,主要分享了Hadoop发展历史、HDFS核心概念、整体架构、工作机制等内容。本文大…

linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(配置数据库监听_09)

修改dbca.rsp响应文件中的重要参数 su - oracle cd response/ vim dbca.rsp本次安装过程中设置了下列参数:(注意下面参数视情况而定,不要照抄,原文件都有说明的) RESPONSEFILE_VERSION "11.2.0" #不能更改 OPERATION_TYPE "…

如何量化考核技术人的 KPI?

摘要: 为什么需要技术KPI? 在业务技术团队,有一个不好的趋势就是团队越来越业务,越来越没有技术味道。每个人都在谈业务,技术大会上在谈业务,周会上在聊业务,周报里写的是业务项目...... 唯独少…

pandas绘图_pandas与seaborn可视化对比小案例

Python网络爬虫与文本数据分析(视频课)之前分享过pandas也是可以作图的,今天复习一下pandas作图,并与seaborn做对比,熟悉下各自绘图的特点。导入用到的库import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns%matplotli…

docker安装zookeeper_Docker安装Zookeeper以及Zookeeper常用命令

Docker安装Zookeeper下载并运行$ docker search zookeeper # 查看一下镜像$ docker pull zookeeper:3.4.9 # 拉取指定版本zk镜像$ docker images # 查看image ID$ mkdir -p /root/docker/zookeeper/data $ docker run -d -p 2181:2181 -v /root/docker/zookeeper/data:/data/…

复杂 SQL 查询跑不动?DRDS 只读实例来解决!

摘要: 在实际业务生产环境中,业务应用系统在使用 OLTP 数据库将数据进行存储后,均会存在如后台运营类系统进行统计报表分析等场景的复杂 SQL 查询诉求。 背景 在实际业务生产环境中,业务应用系统在使用 OLTP 数据库将数据进行存储…