Skip to content

验证码验证拦截器 🔒

功能概述 📝

验证码验证拦截器用于对接口进行验证码校验,支持多种验证方式和场景,有效防止恶意请求和自动化攻击。

功能特性 ✨

验证方式

  • 🖼️ 常规图片验证码:支持自定义长度和复杂度
  • 🔄 自定义验证接口:支持业务系统自定义验证逻辑
  • 🌐 第三方验证:支持腾讯云和阿里云验证码服务

核心功能

  • ✅ 多种验证码类型支持
  • 🔐 业务场景隔离
  • 🎯 灵活的参数获取方式
  • ⏱️ 验证码过期控制
  • 🚦 请求限流保护

配置说明 ⚙️

基础配置参数

参数名类型必填默认值说明
enabledbooleanfalse是否启用验证码拦截器
itemsarray-验证规则配置列表

验证规则配置(items)

参数名类型必填默认值说明
generate-urlsarray-生成验证码的接口地址列表
verify-urlsarray-需要验证码校验的接口地址列表
business-keystring-业务标识,用于隔离不同业务验证码
parameter-typestring-参数获取类型:header(请求头)、query(查询参数)、body(请求体)
code-field-namestring-验证码临时ID参数名
value-field-namestring-验证码值参数名
expirestringPT5M验证码有效期,如PT30M表示30分钟
verify-typestringordinary验证方式:
ordinary: 常规验证
servlet: 接口验证
tencent: 腾讯云验证码
aliyun: 阿里云验证码
verify-uristring-自定义验证接口地址(verify-type=servlet时必填)
verify-timeoutstringPT1M验证请求超时时间
verify-paramsobject-验证参数配置(key-value形式)
rate-limiterbooleanfalse是否启用限流保护

使用示例 📝

1. 常规图片验证码

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true #是否启用,默认false
        items:
          - generate-urls: 
              - /demo/captcha  # 生成验证码接口
            verify-urls: 
              - /demo/login    # 需要验证的接口
            business-key: login  # 业务标识
            parameter-type: body # 参数获取方式
            code-field-name: code  # 验证码ID字段
            value-field-name: captcha  # 验证码值字段
            expire: PT5M  # 5分钟有效期
            rate-limiter: true  # 启用限流

验证码接口说明

  1. 生成验证码接口示例:
java
@PostMapping("/captcha")
public Mono<ResultVo<CaptchaVo>> captcha() {
    // 创建验证码
    AbstractCaptcha captcha = CaptchaUtil.createLineCaptcha(150, 60, 5, 150);
    // 设置字符生成器
    captcha.setGenerator(new RandomGenerator("23456789ABCDEFGHJKLMNPQRSTUVWXYZ", 5));
    
    CaptchaVo vo = new CaptchaVo();
    vo.setCode(captcha.getCode());  // 验证码ID
    vo.setCaptcha(captcha.getImageBase64Data());  // Base64图片数据
    return Mono.just(ResultVo.ok(vo));
}
  1. 接口返回数据格式:
json
{
    "errorNo": 0,
    "data": {
        "code": "88e8d3552ed0d2b8467bc5e497614e69",
        "captcha": "data:image/png;base64,..."
    }
}
  1. 验证接口请求参数:
json
{
    "accountNo": "admin",
    "password": "123456",
    "code": "88e8d3552ed0d2b8467bc5e497614e69",
    "captcha": "4myn"
}

2. 自定义验证码

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true
        items:
          - verify-urls: 
              - /demo/login
            parameter-type: body
            verify-type: servlet
            verify-uri: lb://web1/verifyCaptcha  # 负载均衡方式
            # verify-uri: http://127.0.0.1:8081/verifyCaptcha  # 直接指定地址
            verify-params:  # 验证参数映射
              code: code
              captcha: captcha

自定义验证接口说明

验证接口必须满足以下要求:

  1. 使用POST方法
  2. 支持JSON格式的请求体
  3. 返回ResultVo格式数据
  4. 示例代码:
java
@PostMapping("/verifyCaptcha")
public Mono<ResultVo<Void>> verifyCaptcha(@RequestBody @Valid DataMap map) {
    // 自定义验证逻辑
    log.info("验证参数:{}", JsonHelper.toJsonString(map));
    log.info("用户信息:{}", JsonHelper.toJsonString(UserHelper.getSystemParameter()));
    return Mono.just(ResultVo.ok());
}

3. 腾讯云验证码

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true
        items:
          - verify-urls: 
              - /demo/login
            parameter-type: body
            verify-type: tencent
            verify-params:
              secretId: YOUR_SECRET_ID  # 腾讯云密钥ID
              secretKey: YOUR_SECRET_KEY  # 腾讯云密钥Key
              captchaAppId: YOUR_APP_ID  # 验证码应用ID
              appSecretKey: YOUR_APP_KEY  # 验证码应用密钥
              randstr: randstr  # 随机字符串参数名
              ticket: ticket  # 验证票据参数名
              region: ap-guangzhou  # 服务地域

4. 阿里云验证码

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true
        items:
          - verify-urls: 
              - /demo/login
            parameter-type: body
            verify-type: aliyun
            verify-params:
              sceneId: YOUR_SCENE_ID  # 场景ID
              accessKeyId: YOUR_ACCESS_KEY  # 访问密钥ID
              accessKeySecret: YOUR_SECRET_KEY  # 访问密钥Secret
              captchaVerifyParam: captchaVerifyParam  # 验证参数名
              # host: captcha.cn-shanghai.aliyuncs.com  # 可选,默认上海地域

⚠️ 注意事项

  1. 安全配置

    • 验证码接口需要合理配置权限
    • 验证码有效期建议5分钟以内
    • 建议开启限流保护机制
  2. 接口要求

    • 自定义验证接口必须支持POST请求
    • 必须使用JSON格式的请求体
    • 需要正确处理超时情况
  3. 第三方服务

    • 提前申请相关密钥信息
    • 正确配置服务地域
    • 做好异常处理和降级方案
  4. 性能优化

    • 合理设置验证码复杂度
    • 适当配置限流阈值
    • 监控验证码服务性能

🔗 相关链接