本文主要是分析登录请求 /login 的过程。 调用过程是:【ruoyi-auth模块】 —>【ruoyi-system模块】
原理及流程分析
1.登录认证即系统登录用户的认证过程。
TokenController控制器login方法会进行用户验证,如果验证通过会保存登录日志并返回token,同时缓存中会存入login_tokens:xxxxxx(包含用户、权限信息)。
2.刷新令牌就是对系统操作用户进行缓存刷新,防止过期。
TokenController控制器refresh方法会在用户调用时更新令牌有效期。
【源码解读】网关如何处理登录请求
登录请求 127.0.0.1:8080/auth/login是特殊的请求,做些过滤操作。
AuthFilter 认证过滤器对需要排除的 uri 地址。例如直接过滤了登录、注册和退出。
【源码解读】进入控制层controller完成用户登录并生成token返回
【源码解读】进入服务层service:
主要包括 2 个部分。
1.用 FeignCilent 从远程服务查询用户信息
我们看一下RemoteUserService的源代码,发现RemoteUserService有一个@FeignClient的注释,说明其实在调用remoteUserService的方法时,会被feign自动转发到ruoyi-system模块中去,比如刚才login方法中调用的getUserInfo方法,其实是去调用了ruoyi-system的/user/info/{username}方法了
FeignClient远程查询用户信息:完整类路径
com.ruoyi.system.api.RemoteUserService
url是:/user/info/{username}。
调用服务是: ruoyi-system。
设置了降级 fallback 处理:RemoteUserFallbackFactory
小结:
8080是gateway模块监听的地址,gateway模块中再去nacos获取spring.cloud.gateway对应的路径映射规则。如下图所示,nacos的配置是如何被读取到gateway中来的:
紧接着就是到auth或者直接到system模块,到auth模块的,其实后续auth也会通过feign来访问system或者其他模块的微服务的。
2. 密码验证
注意: remoteUserService.getUserInfo(username, SecurityConstants.INNER) 的 INNER 指定了该请求是“内部”请求,模块 auth 还会对 inner做处理。 主要是验证“可重试次数”和“密码正确性”
1、验证重试次数(默认如果错误超过5次就锁定 10分钟)
2、验证密码是否与数据库匹配。如登录成功需要清除密码错误次数。注册和验证密码用到的密码验证器要一致。