【RuoYi项目分析】在RuoYi网关实现验证码功能


本文主要介绍了用户如何实现验证码,以及该功能如何与 Spring Gateway 联系起来。

1. 验证码功能的类清单

功能
CaptchaProperties 验证码的 yml 配置
CaptchaConfig 验证码图形的具体实现(有数字和字符 2 种)
RouterFunctionConfiguration 定义路由,这是相对 controller 一种新的路由定义方式。
ValidateCodeHandler 路由RouterFunction需要HandlerFunction。桥梁作用。
ValidateCodeService、ValidateCodeServiceImpl 验证码功能的实现逻辑(即 service,serviceImpl
ValidateCodeFilter 针对特定请求需要验证码验证通过才可以

从以上类的清单也可以看出验证码的功能主要包括 2 个方面:

  • 验证码如何实现

主要用 google 的kaptcha来生成图片;以及用 redis 来实现的

涉及到的类:CaptchaConfig、CaptchaProperties、ValidateCodeServiceImpl

  • 验证码如何与 Spring Gateway 的组件联系起来

这一点主要与 Spring Gateway 的工作原理有关系,DispatcherHandler 是 Spring Gateway 最核心的类,负责分发请求,原理跟 MVC 的 DispatcherServlet 非常相似,先暂时不表。

涉及到的类有:RouterFunctionConfiguration、ValidateCodeHandler、ValidateCodeFilter

2. 验证码的实现

2.1. 验证码的获取

  • 定义了获取验证码的路由函数RouterFunction

功能:在请求处理阶段,请求由DispatcherHandler转发到RouterFunctionMapping,再到RouterFunction中定义了处理器HandlerFunction

处理过程:Servlet服务器 —> DispatcherHandler —> handlerMapping列表 —> 某个RouterFunctionMapping —> 根据RouteFunction到具体的RouteFunction —> HandlerFunction —> Service —> ServiceImpl。

  • 定义了验证码的处理器HandlerFunction

功能:关联 RouteFunction 和 ValidateCodeService

  • 定义了一个验证码的配置类CaptchaConfig

启动定义了2个Bean的配置,一个是字符验证码,一个是数字验证码

  • 如何生成验证码

分2种验证码:一种是数字的,一种是字符的
1、数字的:一个方法用来创建数学结果,一个方法用来创建image
2、字符的:一个方法用来创建数学结果,一个方法用来创建image
3、把数学结果缓存到redis中

  • 返回前端uuid和base64的图片

2.2. 验证码的校验

  • 在nacos配置中心只对auth模块配置了验证码的过滤器
      routes:
        # 认证中心
        - id: ruoyi-auth
          uri: lb://ruoyi-auth
          predicates:
            - Path=/auth/**
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1
  • 如果路由匹配了predicate的规则,则进行filter的处理

疑问:如果有多个处理器,那么执行顺序是怎么样的。
解答:
1、先找到断言处理器的映射规则类RoutePredicateHandlerMapping
2、该类的getHandlerInternal方法中的lookupRoute方法会决定采用哪一个route,并设置到request属性中
3、然后是FilteringWebHandler的handler方法
4、handler方法中获取到route的gatewayFilters和全局的globalFilters,然后按照order升序排序。

猜测route的gatewayFilters的order属性1,2,3是不是按照配置中心配置排序的。改变下配置中心的配置重新debug观察下。(猜测正确)

  • filter的顺序问题

结合gatewayFilters是按照配置文件的顺序(order是1,2,3依次递增),globalFilters也是按照order的顺序排序。所以对于RuoYi的过滤器来说顺序是:

AuthFilter(order=-200)
XssFilter(order=-100)
CacheRequestFilter(order=1)
ValidateCodeFilter(order=2)
StripPrefix(order=3)

3. 总结

1、验证码如何实现
这是用户需要考虑的问题,如何实现验证码,最好是能配置不同的验证码

RuoYi 实现了“数字验证码”和“字符验证码”2 种。

2、如何与 Spring Gateway 结合
这是架构师需要考虑的框架问题。如何与 Spring Gateway 结合;那些模块需要配置这个过滤器;那些情况需要验证码;

RuoYi 配置了 auth 模块的 【“/auth/login”, “/auth/register”】2 个请求需要验证码。

4. 资料参考

语雀笔记地址:https://www.yuque.com/yuchangyuan/tkb5br

猜你喜欢

转载自blog.csdn.net/yuchangyuan5237/article/details/133473573