122
社区成员




这个作业属于哪个课程 | 202302软件工程 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 个人技术总结 |
其他参考文献 | 构建之法、CSDN社区 |
使用token进行登录校验,可以用于判断前端的请求是否合法,将未登录用户的请求进行拦截,同时可以将用户的信息保存在后端,便于处理登录之后的请求。该技术的难点在于需要拦截哪些路径及jwt令牌的加密算法上。
什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
JWT请求流程
JWT的主要应用场景
身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。
信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。
优点
JWT的结构
JWT是由三段信息构成的,将这三段信息文本用.连接一起就构成了JWT字符串。就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
JWT包含了三部分:
Header 头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型)
Payload 负载 (类似于飞机上承载的物品)
Signature 签名/签证
声明加密的算法:通常直接使用 HMAC SHA256。加密算法是单向函数散列算法,常见的有MD5、SHA、HAMC。
1,导入依赖
导入jwt令牌相关的依赖,要注意版本的匹配。导入后重新加载maven
2,生成jwt令牌
利用刚刚导入的工具类,可以编写一个自己的jwt类专门用于token的加密及解密。首先设置加密的密钥、令牌自生成起过期的时间。然后编写加密算法:将设置的密钥作为HS256算法的密钥进行加密,并将用户信息和过期时间一并存储到jwt令牌中。加密完成后就获得了包含用户信息且具有时效性的token。
3,将token返回给前端
当前端发出登录请求后,如果用户信息合法,那么后端就会根据刚刚的算法生成包含用户信息的jwt令牌返回给前端,而前端就会在后续的请求中将jwt令牌存储到请求头中的token中。
4,编写登录的拦截器
编写拦截器类继承于HandlerInterceptor类,重写其中的preHandler方法,改方法会在登录拦截后首先执行,首先要判断请求的路径,如果是前端的登录请求或注册请求就不进行拦截,因为此时的用户还没有登录,是没有具体的登录信息的。
5,利用token进行登录校验
首先获取请求头中的token,然后将令牌进行解密,如果不存在token令牌或解密失败则表示用户没有权限,对不合法的请求进行拦截;如果解密成功则将解密得到的用户信息保存在后端便于后续操作
6,注册拦截器
编写完成的拦截器要想生效就必须将利用配置类将其注册,注册之后才能生效
经过以上步骤就可以使用token进行登录拦截及身份校验,同时不要忘了和前端做好协调和对接的工作。
在对token令牌进行解密后,如果解密成功,则会获得储存在令牌中用户信息,spring boot后端需要将获得到的用户信息(如用户id用户名等)进行储存,再后续的逻辑处理中进行使用(如清空购物车需要知晓用户的id进行清空操作)。
但是如何将用户信息储存到合适的位置成了一个难题,因为储存的信息需要做到便于储存的同时做到能够地方便获取到用户的信息。
首先我想到将用户的token储存到临时的数据库中,但是发现这样会降低效率,每次想获取到用户信息时都要对数据库做出请求,造成了不必要的时间浪费。
然后我根据之前编写代码的经验想到了用全局变量储存获取到的用户信息,但是又产生了新问题:由于用户请求的高并发行,当一个请求还未结束时又有新的请求加入,这样会导致存有用户信息的全局变量被后面的请求覆写,从而发生错误。
在查阅了网上的资料后,我得到了解决方案:在spring boot中,当项目启动时相当于一个进程,而每一个请求都是一个单独的线程,可以将用户的信息储存到线程独有的空间中,从而做到一个请求一份用户信息。
实现过程:利用ThreadLocal类将用户id存入到线程的独有空间中,访问时可以直接利用get方法。
在Spring Boot项目中实现基于Token的登录拦截与身份校验机制是现代Web开发中保障用户安全的重要措施之一。这一机制通过使用JWT(JSON Web Token)等Token形式,为用户提供了无状态、可跨域的身份验证方式,使得系统更加轻量级、可扩展,并且支持分布式部署。基于Token的登录拦截与身份校验机制在Spring Boot项目中为应用提供了安全、高效的身份验证手段。通过配置拦截器、验证Token的有效性以及实现Token刷新机制,可以确保系统的安全性和用户体验。未来,随着技术的发展和对项目安全性要求的提高,也可以在此技术的基础上进行优化,以应对更加复杂的安全挑战及项目需求。