1.用户注册
前台需要给我们传递用户名、密码、手机号、手机验证码。验证用户前台传过来的数据是否符合规范,我们使用的Hibernate Validator框架实现的服务端表单校验。短信验证码这块,我们采用的阿里的大于短信接口来做的,我们单独搭建了一个短信微服务,发送的短信请求通过MQ消息由短信微服务消费,进行短信发送。密码我们使用的是Spring提供的BCryptPasswordEncoder加密算法,分成加密和验证两个过程:
-
加密:算法会对明文密码使用UUID随机生成一个salt,使用salt结合密码来加密,得到最终的密文。
-
验证密码:需要先拿到加密后的密码和要验证的密码,根据已加密的密码来推测出salt,然后利用相同的算法和salt对要验证码的密码加密,与已加密的密码对比即可。
短信验证码的有效期为30分钟,为了验证短信验证码的时效性,我们保存到了redis中,手机号作为key,验证码作为value,设置有效期为30分钟。另外为了防止恶意攻击,我们限制一个手机号1分钟之内只能发送一次验证码,这个也是通过redis来实现的,手机号拼接"_yes"为key,验证码为value,设置有效期为1分钟。为了防止机器恶意调用验证码接口,我们这个地方使用图形验证码来进行限制。
2.用户登录
使用JWT+RSA加密技术实现了无状态登录。我们单独搭建了一个校验微服务来进行校验,验证用户名和密码的话需要通过feign组件来调用用户微服务来进行查询,另外的话,我们使用JWT+RSA加密生成一个token返回给前台,写到cookie中。
3.校验登录
在页面created生命周期函数中就调用校验登录的接口。接口的主要逻辑为:
- 去redis中验证token是否存在redis中,如果存在说明,此token失效了,返回401
- 取cookie中的token信息,使用公钥进行解密操作,获取用户信息进行返回
- 如果前两步正确无误,但是token的有效期小于15分钟则进行token的续签操作,即重新生成一个token,写入cookie中即可
- 4.登出(注销/退出登录)操作
-
- 把JWT存入黑名单,就是把token放入redis中,设置一个过期时间(token的有效剩余时间)
- 删除客户端cookie
- 5.网关登录控制
1)获取用户的登录凭证jwt
2)解析jwt,获取用户身份
如果解析失败,证明没有登录,返回401
如果解析成功,继续向下
3)根据身份,查询用户权限信息
4)获取当前请求资源(微服务接口路径)
5)判断是否有访问资源的权限