如何在Spring Boot的Auth模块中接入anji-captcha验证码功能

如何在Spring Boot的Auth模块中接入验证码功能

在现代Web应用的安全认证中,验证码是一种常见的防御机制,用于防止机器人或恶意脚本的自动化攻击。本文将基于Spring Boot框架,结合一个滑动验证码的实现,详细剖析如何在认证(Auth)模块中接入验证码功能。我们将从配置验证码服务、实现验证码接口,到将其集成到认证流程中逐步展开。

一、验证码服务的配置

验证码的接入首先需要定义一个服务类来生成和验证验证码。这里我们使用一个常见的验证码库(如anji-captcha),并通过Spring的@Bean注解将其注入到IoC容器中。

示例代码

java 复制代码
@Bean
public CaptchaService captchaService() {
    Properties config = new Properties();
    config.put(Const.CAPTCHA_CACHETYPE, "redis"); // 使用Redis作为缓存
    config.put(Const.CAPTCHA_WATER_MARK, "");    // 去掉水印
    // 设置验证码类型为滑动拼图验证码
    config.put(Const.CAPTCHA_TYPE, CaptchaTypeEnum.BLOCKPUZZLE.getCodeValue());
    // config.put(Const.ORIGINAL_PATH_JIGSAW, FileUtil.getAbsolutePath("classpath:captcha")); // 可选:自定义拼图路径
    return CaptchaServiceFactory.getInstance(config);
}

重点剖析

  1. 配置参数

    • CAPTCHA_CACHETYPE:指定验证码的缓存类型,这里使用Redis存储验证码状态,避免内存占用过高,同时支持分布式环境。
    • CAPTCHA_WATER_MARK:设置水印,留空表示无水印,可根据需求自定义。
    • CAPTCHA_TYPE:定义验证码类型,这里选择BLOCKPUZZLE(滑动拼图验证码),也可以根据需求替换为其他类型(如点击验证码)。
    • ORIGINAL_PATH_JIGSAW:可选参数,用于指定拼图图片的路径,若不配置则使用默认图片。
  2. 工厂模式

    • CaptchaServiceFactory.getInstance(config)通过工厂模式创建验证码服务实例,根据配置动态生成对应的实现类。

通过这种方式,我们将验证码服务注册为Spring Bean,后续可以通过依赖注入直接使用。


二、验证码控制器的实现

验证码的核心功能包括生成验证码(get)和验证用户输入(check)。我们通过一个CaptchaController类来实现这些接口。

实际上:CaptchaService这个实例是来自于aj包的,我们实际上并不需要自己实现一个Service去校验验证码的功能。因此只需要在Config处配置验证码的类型,以及验证码使用的缓存来源。同时在Controller调用其即可。

示例代码

java 复制代码
@RestController
@RequestMapping("/ua/captcha")
@Api(tags = "验证码")
public class CaptchaController {

    private final CaptchaService captchaService;

    public CaptchaController(CaptchaService captchaService) {
        this.captchaService = captchaService; // 依赖注入
    }

    @PostMapping("/get")
    public ServerResponseEntity<ResponseModel> get(@RequestBody CaptchaVO captchaVO) {
        return ServerResponseEntity.success(captchaService.get(captchaVO));
    }

    @PostMapping("/check")
    public ServerResponseEntity<ResponseModel> check(@RequestBody CaptchaVO captchaVO) {
        return ServerResponseEntity.success(captchaService.check(captchaVO));
    }
}

重点剖析

  1. 依赖注入

    • CaptchaService通过构造函数注入,确保控制器可以调用验证码服务的核心方法。
  2. 接口设计

    • /get:用于生成验证码,返回拼图图片和相关数据(如背景图和拼图块)。
    • /check:验证用户提交的滑动结果(如拼图坐标),返回验证是否成功。
  3. 请求与响应

    • 请求体使用CaptchaVO封装前端传递的参数(如验证码ID或滑动坐标)。
    • 响应使用ServerResponseEntity包装ResponseModel,统一返回格式,提供友好的API交互。
  4. 注解说明

    • @RestController:表明这是一个RESTful控制器,返回JSON数据。
    • @RequestMapping("/ua/captcha"):定义验证码相关接口的统一路径。
    • @Api(tags = "验证码"):Swagger注解,用于生成API文档。

三、验证码DTO的定义

为了在认证流程中使用验证码,我们需要定义一个数据传输对象(DTO),将验证码验证结果与认证参数绑定。

示例代码

java 复制代码
public class CaptchaAuthenticationDTO extends AuthenticationDTO {

    @ApiModelProperty(value = "验证码", required = true)
    private String captchaVerification;

    public String getCaptchaVerification() {
        return captchaVerification;
    }

    public void setCaptchaVerification(String captchaVerification) {
        this.captchaVerification = captchaVerification;
    }

    @Override
    public String toString() {
        return "CaptchaAuthenticationDTO{" + "captchaVerification='" + captchaVerification + '\'' + "} "
                + super.toString();
    }
}

重点剖析

  1. 继承AuthenticationDTO

    • CaptchaAuthenticationDTO继承自基础认证DTO(如用户名、密码等),扩展了验证码字段。
    • 这种设计保持了代码的复用性和扩展性。
  2. 字段定义

    • captchaVerification:存储验证码验证结果,通常由前端调用/check接口后返回的验证令牌。
  3. Swagger注解

    • @ApiModelProperty:为字段提供描述,便于生成API文档。

四、集成到认证流程

验证码接入认证的具体步骤如下:

  1. 前端调用

    • 用户打开登录页面时,调用/ua/captcha/get获取滑动验证码。
    • 用户完成滑动后,调用/ua/captcha/check验证结果,获取captchaVerification
  2. 后端验证

    • 在认证接口(如登录接口)中,接收CaptchaAuthenticationDTO对象。
    • 检查captchaVerification的有效性,若无效则直接返回认证失败。
  3. 示例伪代码

java 复制代码
@PostMapping("/login")
public ServerResponseEntity login(@RequestBody CaptchaAuthenticationDTO dto) {
    ResponseModel response = captchaService.verification(dto.getCaptchaVerification());
    if (!response.isSuccess()) {
        return ServerResponseEntity.fail("验证码验证失败");
    }
    // 继续用户名密码认证逻辑
    return ServerResponseEntity.success("登录成功");
}

五、总结

通过以上步骤,我们在Auth模块中成功接入了滑动验证码功能。核心要点包括:

  • 使用@Bean配置验证码服务,灵活支持多种类型。
  • 通过CaptchaController暴露生成和验证接口。
  • 定义CaptchaAuthenticationDTO将验证码融入认证流程。
  • 在认证逻辑中验证验证码结果,确保安全性。
相关推荐
烛阴3 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
服务端技术栈3 小时前
电商营销系统中的幂等性设计:从抽奖积分发放谈起
后端
你的人类朋友4 小时前
✍️Node.js CMS框架概述:Directus与Strapi详解
javascript·后端·node.js
面朝大海,春不暖,花不开4 小时前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
钡铼技术ARM工业边缘计算机4 小时前
【成本降40%·性能翻倍】RK3588边缘控制器在安防联动系统的升级路径
后端
CryptoPP5 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长5 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
草捏子6 小时前
状态机设计:比if-else优雅100倍的设计
后端
考虑考虑7 小时前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积7 小时前
一起来学 Langgraph [第三节]
后端