Skip to content

验证码验证拦截器

注意

此拦截器用于对接口进行图片验证码验证。

功能特性

  • 支持多种验证码验证方式:
    • 常规图片验证码验证
    • 自定义验证码验证
    • 腾讯云验证码
    • 阿里云验证码
  • 支持验证码业务隔离
  • 支持多种参数获取方式
  • 支持验证码过期时间配置
  • 支持验证码限流控制

配置说明

基础配置

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

验证规则配置(items)

参数名类型必填默认值说明
generate-urlsarray-生成验证码的接口地址列表,支持通配符匹配
verify-urlsarray-需要进行验证码验证的接口地址列表,支持通配符匹配
business-keystring-业务标识key,用于隔离不同业务的验证码
parameter-typestring-参数获取类型:header(请求头)、query(查询参数)、body(请求体)
code-field-namestring-验证码临时code的参数名称
value-field-namestring-验证码值的参数名称
expirestringPT5M验证码过期时间,支持秒(S)、分钟(M)、小时(H)、天(D),如:PT30M表示30分钟
verify-typestringordinary验证方式:
ordinary: 常规验证
servlet: 接口验证
tencent: 腾讯云验证码
aliyun: 阿里云验证码
verify-uristring-验证接口地址,仅在verify-type=servlet时有效
verify-timeoutstringPT1M验证超时时间,格式同expire
verify-paramsobject-验证参数配置,key-value形式
rate-limiterbooleanfalse是否启用限流,验证通过后自动删除限流信息

使用示例

1. 常规图片验证码配置

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true #是否启用,默认false
        items:
        - generate-urls: 
          - /demo/captcha #生成图片验证码接口地址
          verify-urls: 
          - /demo/login #需要验证图片验证码接口地址
          code-field-name: code #验证码临时code参数名称
          value-field-name: captcha #验证码值参数名称
          parameter-type: body #验证码取值参数类型

特殊说明:需要注意接口登录权限的处理

验证码接口

  • 登录接口/demo/login需要图片验证码
  • 通过访问生成验证码接口http://127.0.0.1:8080/demo/captcha,接口返回ResultVo<CaptchaVo>
  • 生成验证码代码
java
	@PostMapping(value = "/captcha", produces = MediaType.APPLICATION_JSON_VALUE)
	public Mono<ResultVo<CaptchaVo>> captcha() {
		AbstractCaptcha captcha = CaptchaUtil.createLineCaptcha(150,60,5,150);
		captcha.setGenerator(new RandomGenerator("23456789ABCDEFGHJKLMNPQRSTUVWXYZ",5));
		String captchaCode = captcha.getCode();
		CaptchaVo vo = new CaptchaVo();
		//验证码值
		vo.setCode(captchaCode);
		//验证码图片
		vo.setCaptcha(captcha.getImageBase64Data());
		return Mono.just(ResultVo.ok(vo));
	}
  • 验证码返回数据
json
{
    "errorNo":0,
    "data":
    {
        "code":"88e8d3552ed0d2b8467bc5e497614e69",
        "captcha":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAoCAIAAACTo5SwAAADMElEQVR42u3asWuVMRAA8PePufoHdFXpooh0VWihiwUnXVwc3tPBwUXU0oKCxUFQFBQnF4cHDoIIYhfdXwMH4cgll0tyyZev5rih330p79Ef+XLJ18WGjQ/fP9rcjOgyFrwfczmid0Iv2FAchCNaETJUQ3EQjhiEI84T4eHfZzYH4czaGcr230JqEt7eu+Sk1rdc7uziPLi+zdA6g00KP+XhjftOCoeFRgrj0ZOVk8KRylt76jcJobmVTUh5SqRLCEOKyYQb8QGb10+LkJKAk3dkbcI2fl7C0IBF+Z+4qp+XEKjoWljoFxVS92MIqWItwpBfbUKwwR0pM6xE8ZwTOmDtCaNjooRHRy9wMoQ1/CYm5P3qLYRahNbMKd7Z2qNU+PLe1q7JT8dPISv5OU6M7kLFr9kUxJVCP+ZDqSL2c+ZfiSKFaUTopWpPGL0MEfJ+MOe8itSvUDFKaLXUCBmnuRBG/RjFBoRJxWTC/ZsXbDpIO1cuQtZeCPnuRvIgLST0Ds4jlE84vtMREf45XQKbTVMxCXdfPj6xdVCsNwVDhMx4RUKvlu4UlLQ50jNS7Bfa/xlXPPOwonAuvv+9xtkPIW1qsBlOxV5mAkLq59SjfnwlRJJa1yXUiqaEofMXnjDVj9YlVBLyDEUzpsZGXkiYtOUXrYW2hcGPUO9TVJFQuJFP9ZMoTu6XdPyd0JFCC+M0Mt7tBNTrEcp7n+jRWqhYQnj45hhnHqH8JVTpMTduRyElfpK1sDZh6IxU+NaJ8YtW+iKETSF+hCb9LtORtiHMeF+R5Beqd0Ro5SBV1okvv97evXoNEjyef/4HWe538u6UZlU/elf4bxbCkcrvC8vxTGISo3hw+ZYdEFKUEHq1vLeSCJc/X9HkFfsiVAzAcwLM8C1mLvKTT2UMxfNOQS8kP02zo2tCq+XcylBUJ3SEvDySMYMwTVH4IB2ECmuhpXIqJYTydmYQ6kCaDFElEf5YfcWp+D3HWhiPckJqpqso70hV/F6vH0DOhtCrVeJXSTFja5/n5/25d0LHrNyvvaK6n1OZASHI8acz/RBuZMfcWoTfVut5EGbEhITqQf1s3RCeAa0b9swfeTD/AAAAAElFTkSuQmCC"
    }
}
  • 登录接口http://127.0.0.1:8080/demo/login传入附加验证码参数
  • 登录接口传入数据
json
{
    "accountNo":"admin",
    "password":"123456",
    "code":"88e8d3552ed0d2b8467bc5e497614e69", //验证码临时code
    "captcha":"4myn" //验证码值
}

2. 自定义验证码配置

网关配置

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true #是否启用,默认false
        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

特殊说明:需要注意接口登录权限的处理

验证接口

  • 登录接口/demo/login传入验证
  • 自定义验证验证码接口,必须使用body接收参数,并且是post请求
  • 验证验证码代码(自定义逻辑处理)
java
	@PostMapping(value= "/verifyCaptcha",produces = MediaType.APPLICATION_JSON_VALUE)
	public Mono<ResultVo<Void>> verifyCaptcha(@RequestBody @Valid DataMap map)
	{
    //TODO 自定义处理
		System.err.println("接收到参数:"+JsonHelper.toJsonString(map));
		System.err.println("接收到用户信息:"+JsonHelper.toJsonString(UserHelper.getSystemParameter()));
		return Mono.just(ResultVo.ok());
	}
  • 登录接口http://127.0.0.1:8080/demo/login传入附加验证码参数
  • 登录接口传入数据
json
{
    "accountNo":"admin",
    "password":"123456",
    "code":"88e8d3552ed0d2b8467bc5e497614e69", //验证码临时code
    "captcha":"4myn" //验证码值
}

3. 腾讯云验证码配置

网关配置

参考地址;https://cloud.tencent.com/document/product/1110/75489

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true #是否启用,默认false
        items:
        - verify-urls: 
          - /demo/login #需要验证图片验证码接口地址
          parameter-type: body #验证码取值参数类型
          verify-type: tencent #指定验证类型
          verify-params: #需要验证传输的参数
            secretId: aa #秘钥信息
            secretKey: bv #秘钥信息
            captchaAppId: 197894 #验证码应用ID
            appSecretKey: sddsdsd #验证码应用密钥
            randstr: randstr #随机字符串,指定对应的获取参数名称
            ticket: ticket #用户验证票据,指定对应的获取参数名称
            region: ap-guangzhou #地域

特殊说明:需要注意接口登录权限的处理

4. 阿里云验证码配置

网关配置

阿里云配置参数参考:https://help.aliyun.com/zh/captcha/captcha2-0/user-guide/access-guidelines?spm=a2c4g.11186623.0.0.19ab218cNAoPFW

yaml
wueasy:
  gateway:
    filter:
      captcha:
        enabled: true #是否启用,默认false
        items:
        - verify-urls: 
          - /demo/login #需要验证图片验证码接口地址
          parameter-type: body #验证码取值参数类型
          verify-type: aliyun #指定验证类型
          verify-params: #需要验证传输的参数
            sceneId: sddd #本次验证对应的场景ID
            accessKeyId: sdds #秘钥信息
            accessKeySecret: sdsd #秘钥信息
            captchaVerifyParam: captchaVerifyParam #由验证码脚本回调的验证参数,指定对应的获取参数名称。
            #host: captcha.cn-shanghai.aliyuncs.com #默认为captcha.cn-shanghai.aliyuncs.com,可以不配置

注意事项

  1. 使用验证码拦截器时,需要确保相关接口的登录权限配置正确
  2. 验证码过期时间(expire)建议不要设置过长,推荐5分钟以内
  3. 使用自定义验证接口时,接口必须支持POST请求并使用body接收参数
  4. 使用第三方验证码服务时,需要提前在对应平台申请相关密钥信息
  5. 启用限流功能时,验证通过后会自动清理限流信息

相关链接