如何在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将验证码融入认证流程。
  • 在认证逻辑中验证验证码结果,确保安全性。
相关推荐
w***95496 小时前
SQL美化器:sql-beautify安装与配置完全指南
android·前端·后端
橙子家6 小时前
Serilog 日志库简单实践(三)集中式日志与分析平台 Sinks(.net8)
后端
r***12387 小时前
Spring boot启动原理及相关组件
数据库·spring boot·后端
m***11907 小时前
【SpringBoot】Spring Boot 项目的打包配置
java·spring boot·后端
李慕婉学姐7 小时前
Springboot剪纸数字博物馆系统6wd19a3a(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·spring boot·后端
追逐时光者7 小时前
精选 5 款 .NET 开源、实用的商城系统(Shop),快速商城二开利器!
后端·.net
追逐时光者8 小时前
一款基于 .NET + 计算机视觉技术开源免费、功能强大的原神智能辅助工具,一键解放双手!
后端·.net
90后小陈老师8 小时前
用户管理系统 05 实现后端注册功能 | Java新手实战 | 最小架构 | 期末实训 | Java+SpringBoot+Vue3
java·开发语言·spring boot·后端·spring·maven·mybatis
k***85848 小时前
【SpringBoot】【log】 自定义logback日志配置
android·前端·后端
canonical_entropy9 小时前
可逆计算的方法论来源
后端·低代码