如何在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将验证码融入认证流程。
  • 在认证逻辑中验证验证码结果,确保安全性。
相关推荐
Assby2 分钟前
如何尽可能精确计算线程池执行 shutdown() 后的耗时?
java·后端
星浩AI24 分钟前
Google 官方发布:让你的 AI 编程助手"边写、边看、边调",像人类开发者一样工作
人工智能·后端·开源
喵了个Code1 小时前
Spring Boot 3 + Spring Security + OAuth2 + Gateway企业级认证授权平台实现
后端
开心猴爷1 小时前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
后端
桦说编程2 小时前
简单方法实现子任务耗时统计
java·后端·监控
盖世英雄酱581362 小时前
物品超领取损失1万事故复盘(一)
java·后端
凌览2 小时前
别再死磕 Nginx!http-proxy-middleware 低配置起飞
前端·后端
拾玖不会code2 小时前
简单分表场景下的业务发散思考:分表如何保证丝滑?
后端
CryptoRzz2 小时前
印度尼西亚(IDX)股票数据对接开发
java·后端·websocket·web3·区块链
咕白m6253 小时前
通过 C# 快速生成二维码 (QR code)
后端·.net