个人技术总结——使用token进行登录拦截及身份校验

222100312李冬铭 2024-06-02 23:54:03
这个作业属于哪个课程202302软件工程
这个作业要求在哪里软件工程实践总结&个人技术博客
这个作业的目标个人技术总结
其他参考文献构建之法、CSDN社区

目录

  • 一、技术概述
  • 二、技术详述
  • 2.1 技术介绍
  • 2.2 技术实现
  • 三、技术使用中遇到的问题和解决过程
  • 3.1 遇到的问题
  • 3.2 解决过程
  • 四、总结
  • 参考资料

一、技术概述

使用token进行登录校验,可以用于判断前端的请求是否合法,将未登录用户的请求进行拦截,同时可以将用户的信息保存在后端,便于处理登录之后的请求。该技术的难点在于需要拦截哪些路径及jwt令牌的加密算法上。

二、技术详述

2.1 技术介绍

什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

JWT请求流程

在这里插入图片描述

  • 用户使用账号和面发出post请求;
  • 服务器使用私钥创建一个jwt;
  • 服务器返回这个jwt给浏览器;
  • 浏览器将该jwt串在请求头中像服务器发送请求;
  • 服务器验证该jwt;
  • 返回响应的资源给浏览器。

JWT的主要应用场景

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。

信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

优点

  • 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快
  • 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库
  • 因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。
    不需要在服务端保存会话信息,特别适用于分布式微服务。

JWT的结构

JWT是由三段信息构成的,将这三段信息文本用.连接一起就构成了JWT字符串。就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT包含了三部分:

Header 头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型)
Payload 负载 (类似于飞机上承载的物品)
Signature 签名/签证

声明加密的算法:通常直接使用 HMAC SHA256。加密算法是单向函数散列算法,常见的有MD5、SHA、HAMC。

  • MD5(message-digest algorithm 5) (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值
  • SHA (Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,安全性高于MD5
  • HMAC (Hash Message Authentication Code),散列消息鉴别码,基于密钥的Hash算法的认证协议。用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。常用于接口签名验证

2.2 技术实现

1,导入依赖

导入jwt令牌相关的依赖,要注意版本的匹配。导入后重新加载maven

在这里插入图片描述

2,生成jwt令牌

利用刚刚导入的工具类,可以编写一个自己的jwt类专门用于token的加密及解密。首先设置加密的密钥、令牌自生成起过期的时间。然后编写加密算法:将设置的密钥作为HS256算法的密钥进行加密,并将用户信息和过期时间一并存储到jwt令牌中。加密完成后就获得了包含用户信息且具有时效性的token。

在这里插入图片描述

3,将token返回给前端

当前端发出登录请求后,如果用户信息合法,那么后端就会根据刚刚的算法生成包含用户信息的jwt令牌返回给前端,而前端就会在后续的请求中将jwt令牌存储到请求头中的token中。

在这里插入图片描述

4,编写登录的拦截器

编写拦截器类继承于HandlerInterceptor类,重写其中的preHandler方法,改方法会在登录拦截后首先执行,首先要判断请求的路径,如果是前端的登录请求或注册请求就不进行拦截,因为此时的用户还没有登录,是没有具体的登录信息的。

在这里插入图片描述

5,利用token进行登录校验

首先获取请求头中的token,然后将令牌进行解密,如果不存在token令牌或解密失败则表示用户没有权限,对不合法的请求进行拦截;如果解密成功则将解密得到的用户信息保存在后端便于后续操作

在这里插入图片描述

6,注册拦截器

编写完成的拦截器要想生效就必须将利用配置类将其注册,注册之后才能生效

在这里插入图片描述

经过以上步骤就可以使用token进行登录拦截及身份校验,同时不要忘了和前端做好协调和对接的工作。

三、技术使用中遇到的问题和解决过程

3.1 遇到的问题

在对token令牌进行解密后,如果解密成功,则会获得储存在令牌中用户信息,spring boot后端需要将获得到的用户信息(如用户id用户名等)进行储存,再后续的逻辑处理中进行使用(如清空购物车需要知晓用户的id进行清空操作)。

但是如何将用户信息储存到合适的位置成了一个难题,因为储存的信息需要做到便于储存的同时做到能够地方便获取到用户的信息。

3.2 解决过程

首先我想到将用户的token储存到临时的数据库中,但是发现这样会降低效率,每次想获取到用户信息时都要对数据库做出请求,造成了不必要的时间浪费。

然后我根据之前编写代码的经验想到了用全局变量储存获取到的用户信息,但是又产生了新问题:由于用户请求的高并发行,当一个请求还未结束时又有新的请求加入,这样会导致存有用户信息的全局变量被后面的请求覆写,从而发生错误。

在查阅了网上的资料后,我得到了解决方案:在spring boot中,当项目启动时相当于一个进程,而每一个请求都是一个单独的线程,可以将用户的信息储存到线程独有的空间中,从而做到一个请求一份用户信息。

实现过程:利用ThreadLocal类将用户id存入到线程的独有空间中,访问时可以直接利用get方法。

在这里插入图片描述

四、总结

在Spring Boot项目中实现基于Token的登录拦截与身份校验机制是现代Web开发中保障用户安全的重要措施之一。这一机制通过使用JWT(JSON Web Token)等Token形式,为用户提供了无状态、可跨域的身份验证方式,使得系统更加轻量级、可扩展,并且支持分布式部署。基于Token的登录拦截与身份校验机制在Spring Boot项目中为应用提供了安全、高效的身份验证手段。通过配置拦截器、验证Token的有效性以及实现Token刷新机制,可以确保系统的安全性和用户体验。未来,随着技术的发展和对项目安全性要求的提高,也可以在此技术的基础上进行优化,以应对更加复杂的安全挑战及项目需求。

参考资料

...全文
159 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

122

社区成员

发帖
与我相关
我的任务
社区描述
FZU-SE
软件工程 高校
社区管理员
  • LinQF39
  • 助教-吴可仪
  • 一杯时间
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧