查看原文
其他

tianai-captcha:开源界最好用的行为验证码

小刘 爱编程爱技术 2023-12-13

每天给大家带来网站工具、安卓软件、iOS软件、开源社区项目等黑科技!

如果你们有什么好的建议,也可以在后台留言。

创作不易,希望大家给一点鼓励,把公众号设置为"星标",点下文章"在看",谢谢大家!目前佛系更新,望多多支持~


小编今天发现一个有趣的开源验证码库:tianai-captcha,能够生成各种行为验证码,好看又好用。目前支持的验证码类型有滑块验证码、旋转验证码、文字点选验证码、滑动还原、旋转角度验证、刮刮乐(beta),图标点选、语序点选等等。

在线体验地址:
http://captcha.tianai.cloud/

✨整体架构设计

tianai-captcha 验证码整体分为:

1、生成器(ImageCaptchaGenerator)

主要负责生成行为验证码所需的图片

2、校验器(ImageCaptchaValidator)

主要负责校验用户滑动的行为轨迹是否合规

3、资源管理器(ImageCaptchaResourceManager) 

主要负责读取验证码背景图片和模板图片等

资源管理器细分为:
  • 资源存储(ResourceStore)

负责存储背景图和模板图

  • 资源提供者(ResourceProvider)

负责将资源存储器中对应的资源转换为文件流

一般资源存储器中存储的是图片的url地址或者id之类,资源提供者 就是负责将url或者别的id转换为真正的图片文件

4、图片转换器 (ImageTransform)
主要负责将图片文件流转换成字符串类型,可以是base64格式/url 或其它加密格式,默认实现是bas64格式
其中生成器、校验器、资源管理器等都是基于接口模式实现可插拔的,可以替换为自定义的实现,灵活度高。

🚚集成 Springboot

如果使用Springboot,可以使用官方提供的SpringBoot脚手架工具:tianai-captcha-springboot-starter。该工具对tianai-captcha验证码进行了封装,使用更加方便快捷。

1、引入依赖
<!-- maven导入 --><dependency> <groupId>cloud.tianai.captcha</groupId> <artifactId>tianai-captcha-springboot-starter</artifactId> <version>1.4.1</version></dependency>
2、使用ImageCaptchaApplication生成和校验对象
package cloud.tianai.captcha.readme;

import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;import cloud.tianai.captcha.spring.application.CaptchaImageType;import cloud.tianai.captcha.spring.application.ImageCaptchaApplication;import cloud.tianai.captcha.spring.vo.CaptchaResponse;import cloud.tianai.captcha.spring.vo.ImageCaptchaVO;import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack;import org.springframework.beans.factory.annotation.Autowired;
public class Test2 {
@Autowired    private ImageCaptchaApplication application;
public void test() { // 1.生成滑块验证码(该数据返回给前端用于展示验证码数据) CaptchaResponse<ImageCaptchaVO> res1 = application.generateCaptcha(CaptchaTypeConstant.SLIDER);
// 2.前端滑动完成后把数据传入后端进行校验是否通过, // 参数1: 生成的验证码对应的id, 由前端传过来 // 参数2: 滑动轨迹验证码相关数据 ImageCaptchaTrack, 由前端传过来 // 返回 match.isSuccess() 如果为true, 则验证通过 ImageCaptchaTrack sliderCaptchaTrack = new ImageCaptchaTrack(); ApiResponse<?> match = application.matching(res1.getId(), sliderCaptchaTrack); }}
3、扩展功能配置

① 配置yaml文件如下:

# 滑块验证码配置, 详细请看 cloud.tianai.captcha.autoconfiguration.ImageCaptchaProperties 类captcha: # 如果项目中使用到了redis,滑块验证码会自动把验证码数据存到redis中, 这里配置redis的key的前缀,默认是captcha:slider prefix: captcha # 验证码过期时间,默认是2分钟,单位毫秒, 可以根据自身业务进行调整 expire: # 默认缓存时间 2分钟 default: 10000 # 针对 点选验证码 过期时间设置为 2分钟, 因为点选验证码验证比较慢,把过期时间调整大一些 WORD_IMAGE_CLICK: 20000 # 使用加载系统自带的资源, 默认是 false init-default-resource: false cache: # 缓存控制, 默认为false不开启 enabled: true # 验证码会提前缓存一些生成好的验证数据, 默认是20 cacheSize: 20 # 缓存拉取失败后等待时间 默认是 5秒钟 wait-time: 5000 # 缓存检查间隔 默认是2秒钟 period: 2000 secondary: # 二次验证, 默认false 不开启 enabled: false # 二次验证过期时间, 默认 2分钟 expire: 120000 # 二次验证缓存key前缀,默认是 captcha:secondary keyPrefix: "captcha:secondary"

② 二次验证

设置配置文件 captcha.secondary.enabled=true开启二次验证
package cloud.tianai.captcha.readme;
import cloud.tianai.captcha.spring.application.ImageCaptchaApplication;import cloud.tianai.captcha.spring.plugins.secondary.SecondaryVerificationApplication;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;
public class Test3 {
@Autowired    private ImageCaptchaApplication sca;
@GetMapping("/check2") @ResponseBody public boolean check2Captcha(@RequestParam("id") String id) { // 如果开启了二次验证 if (sca instanceof SecondaryVerificationApplication) { return ((SecondaryVerificationApplication) sca).secondaryVerification(id); } return false; }}

③ 添加自定义模板/背景图片

通过扩展ResourceStore接口添加自定义背景图片
  • 添加模板使用 addTemplate(type1, template1) 方法

  • 添加背景图片使用 addResource(type1, res1)方法

package cloud.tianai.captcha.demo;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant;import cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator;import cloud.tianai.captcha.resource.common.model.dto.Resource;import cloud.tianai.captcha.resource.common.model.dto.ResourceMap;import cloud.tianai.captcha.resource.impl.DefaultResourceStore;import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider;import org.springframework.stereotype.Component;
import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH;
/**
 * 负责模板和背景图存储的地方 */@Componentpublic class MyResourceStore extends DefaultResourceStore {
    public MyResourceStore() {
// 滑块验证码 模板 (系统内置) ResourceMap template1 = new ResourceMap("default",4); template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/active.png"))); template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/fixed.png"))); ResourceMap template2 = new ResourceMap("default",4); template2.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/2/active.png"))); template2.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/2/fixed.png"))); // 旋转验证码 模板 (系统内置) ResourceMap template3 = new ResourceMap("default",4); template3.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/active.png")));        template3.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/fixed.png")));
// 1. 添加一些模板 addTemplate(CaptchaTypeConstant.SLIDER, template1); addTemplate(CaptchaTypeConstant.SLIDER, template2);        addTemplate(CaptchaTypeConstant.ROTATE, template3);
// 2. 添加自定义背景图片 addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/a.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/b.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/c.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/d.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/e.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/g.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/h.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/i.jpg","default")); addResource(CaptchaTypeConstant.SLIDER, new Resource("classpath", "bgimages/j.jpg","default")); addResource(CaptchaTypeConstant.ROTATE, new Resource("classpath", "bgimages/48.jpg","default")); addResource(CaptchaTypeConstant.CONCAT, new Resource("classpath", "bgimages/48.jpg","default")); addResource(CaptchaTypeConstant.WORD_IMAGE_CLICK, new Resource("classpath", "bgimages/c.jpg","default")); }}

🍄最后贴上官方相关链接

在线体验地址:
http://captcha.tianai.cloud/
Github 开源地址:
https://github.com/tianaiyouqing/tianai-captcha
Gitee开源地址:
https://gitee.com/tianai/tianai-captcha
开发手册:
http://doc.captcha.tianai.cloud/
springboot-starter开源地址:
https://github.com/tianaiyouqing/tianai-captcha-springboot-starter
官方demo地址:

https://github.com/tianaiyouqing/tianai-captcha-demo

END

👨‍🎓聊一聊

  • 公众号推送改版,务必点击【爱编程爱技术】右上角【设为星标🌟】,这样才不会错过推送。

  • 如果侵犯了您的权益,请点击菜单栏联系公众号,一经核实,我们会在最短的时间内删除!感谢理解!

  • 该系列软件虽经本人亲测可用,但难免有疏忽之处,一旦您下载使用此软件,后续风险需自行承担,发布者本人不对使用此资源负任何责任!

点点关注不迷路

本文发表于公众号【爱编程爱技术

关注我们,阅读更多精彩内容

点击上方关注我们,谢谢支持

往期推荐:

VeryCapture,一款堪称最强的截图、录制、识别工具!人人必备!
AutoGPT:150k+ stars  开源自主的人工智能GPT程序
Xmind 思维导图最新Pro解锁版!
tldraw:21.5k stars 开源的手绘风格画图工具!
dbeaver:34k+ Stars 开源数据库管理工具,吊打Navicat!
MAS:40k+ stars 开源免费的Windows/Office激活工具
DataGear:5k+ 开源免费的数据可视化分析平台!
MAS:40k+ stars 开源免费的Windows/Office激活工具
upscayl:18.4k Stars 开源 AI 图片无损放大增强软件!
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存