登录认证即分为登录和认证两部分,下面聊下他们的实现逻辑。

1 登录

前端调用后端的登录接口,后端验证用户名和密码等成功后,则做下面两个主要工作:

  • 1 以用户id为key,生成的token为value,缓存到redis中并设置过期时间
  • 2 以生成的token为key,用户信息为value,缓存到redis中并设置过期时间

最后将token及用户信息返回给前端,前端将token放在header中,调用其他接口时都携带着。
如果退出登录,则将上面的两条信息从redis中删除即可

2 认证

前端调用其他接口时,先经过一个全局拦截器,这个全局拦截器可以实现Spring的HanderInterceptorAdapter并重写preHandle和afterCompletion方法。

  • 1 在preHandle方法中,首先获取前端请求header中的token,并校验该token是否有效的存放在redis中,如果有效,则判断是否需要token续期(例如:token缓存在redis中的过期时间是2小时,如果token当前剩余时间小于(2-1)小时,则将token的过期时间重新设置成2小时);然后将token及用户信息保存到本地ThreadLocal中;最后返回true。
  • 2 在afterCompletion方法中,将ThreadLocal中的信息清除。我们知道:当一个接口请求处理完成后会调用afterCompletion方法,所以这个ThreadLocal也就是当前接口请求有效,当一个接口请求执行完成后,则将ThreadLocal中的用户信息清除。

为什么不使用JWT的方案?

1、使用了JWT,服务端无法对用户请求进行管理,比如:统计登录用户数、统计一个用户登录了多少次。
2、使用了JWT,服务端无法剔除一个已登录的用户,因为JWT一旦生成,在失效之前,总是有效的。

延申

JWT全称JSON Web Token,由三部分组成:header(头部,用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等)、payload(载荷,就是存放有效信息的地方,在这一部分中存放token过期时间、签发时间等,且payload是明文的)和signature(签名。服务器端可以自行选择一个算法和一个secret,与payload拼接上,得到一个签名,secret并不会在网络中传输,所以客户端无法伪造一个JWT)。

扫码登录:https://mp.weixin.qq.com/s/T3YOppJqW85oK7mUujEReA

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐