如何在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将验证码融入认证流程。
  • 在认证逻辑中验证验证码结果,确保安全性。
相关推荐
uhakadotcom6 分钟前
React Query:简化数据获取和状态管理的利器
后端·面试·github
小菜不菜。16 分钟前
本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成
java·spring boot·后端
007php00734 分钟前
企微审批中MySQL字段TEXT类型被截断的排查与修复实践
大数据·开发语言·数据库·后端·mysql·重构·golang
倚栏听风雨34 分钟前
类型引起的索引失效-mybatis TypeHandler 完美解决
后端
猿毕设1 小时前
【FL0090】基于SSM和微信小程序的球馆预约系统
java·spring boot·后端·python·微信小程序·小程序
山间点烟雨1 小时前
3. 前后端实现压缩包文件下载
前端·后端·压缩包
m0_748238631 小时前
【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
spring boot·后端·mybatis
aircrushin1 小时前
【PromptCoder + Cursor】利用AI智能编辑器快速实现设计稿
前端·后端·html
m0_748234342 小时前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
Oo_Amy_oO3 小时前
使用SDKMAN!安装springboot
spring boot·后端·sdkman