如何在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将验证码融入认证流程。
  • 在认证逻辑中验证验证码结果,确保安全性。
相关推荐
Moment9 分钟前
Node.js v25.0.0 发布——性能、Web 标准与安全性全面升级 🚀🚀🚀
前端·javascript·后端
IT_陈寒23 分钟前
Vite 3.0 性能优化实战:5个技巧让你的构建速度提升200% 🚀
前端·人工智能·后端
程序新视界42 分钟前
MySQL的整体架构及功能详解
数据库·后端·mysql
绝无仅有44 分钟前
猿辅导Java面试真实经历与深度总结(二)
后端·面试·github
绝无仅有1 小时前
猿辅导Java面试真实经历与深度总结(一)
后端·面试·github
Victor3562 小时前
Redis(76)Redis作为缓存的常见使用场景有哪些?
后端
Victor3562 小时前
Redis(77)Redis缓存的优点和缺点是什么?
后端
摇滚侠5 小时前
Spring Boot 3零基础教程,WEB 开发 静态资源默认配置 笔记27
spring boot·笔记·后端
天若有情6737 小时前
Java Swing 实战:从零打造经典黄金矿工游戏
java·后端·游戏·黄金矿工·swin
一只叫煤球的猫8 小时前
建了索引还是慢?索引失效原因有哪些?这10个坑你踩了几个
后端·mysql·性能优化