基于Redis+Token实现登录认证_mameng1988的博客-CSDN博客_redis token

来源: 基于Redis+Token实现登录认证_mameng1988的博客-CSDN博客_redis token

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

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
————————————————
版权声明:本文为CSDN博主「mameng1998」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mameng1988/article/details/115866883

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏