springboot整合springsecurity框架,什么是JWT,分析如何实现单点登录(分布式项目)(二)

什么是JWT

从分布式认证流程中,我们不难发现,这中间起最关键作用的就是token,token的安全与否,直接关系到系统的健壮性,这里我们选择使用JWT来实现token的生成和校验
JWT,全称JSON Web Token,官网地址https://jwt.io,是一款出色的分布式身份校验方案。可以生成token,也可以解析检验token。
JWT生成的token由三部分组成:
头部:主要设置一些规范信息,签名部分的编码格式就在头部中声明。
载荷:token中存放有效信息的部分,比如用户名,用户角色,过期时间等,但是不要放密码,会泄露!
签名:将头部与载荷分别采用base64编码后,用“.”相连,再加入盐,最后使用头部声明的编码类型进行编码,就得到了签名。

也就是我们要使用JWT这个技术生成token

为了安全,加密的时候用一种技术,解密的时候用另一个技术。

非对称加密RSA介绍

基本原理:同时生成两把**:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端
私钥加密,持有私钥或公钥才可以解密
公钥加密,持有私钥才可解密

SpringSecurity+JWT+RSA分布式认证思路分析

回顾之前的springsecurity框架的认证

springsecurity框架底层就是过滤器,有很多的不同的过滤器

这个是springsecurity框架源码里面认证的过滤器

springboot整合springsecurity框架,什么是JWT,分析如何实现单点登录(分布式项目)(二)
里面有个方法
springboot整合springsecurity框架,什么是JWT,分析如何实现单点登录(分布式项目)(二)
就是在这个方法里面接收前端传过来的用户名和密码之后进行认证。认证成功之后,我们进入父类AbstractAuthenticationProcessingFilter这个过滤器,从这个里面找成功之后应该做什么

里面有一个方法
springboot整合springsecurity框架,什么是JWT,分析如何实现单点登录(分布式项目)(二)

这个方法里面的内容就是将认证成功之后的消息,放到安全框架里面的容器里面,相当于在容器里面放了一个认证通过的对象。

现在的单点登录

现在是认证通过之后,向用户颁发一个通信的token,而不是在session里面保存认证完成的对象。所以这个认证通过的方法successfulAuthentication() 我们是需要对它重写的。

用户认证
由于,分布式项目,多数是前后端分离的架构设计,我们要满足可以接受异步post的认证请求参数,需要修改UsernamePasswordAuthenticationFilter过滤器中attemptAuthentication方法,让其能够接收请求体。另外,默认successfulAuthentication方法在认证通过后,是把用户信息直接放入session就完事了,现在我们需要修改这个方法,在认证通过后生成token并返回给用户。
身份校验
原来BasicAuthenticationFilter过滤器中doFilterInternal方法校验用户是否登录,就是看session中是否有用户信息,我们要修改为,验证用户携带的token是否合法,并解析出用户信息,SpringSecurity,以便于后续的授权功能可以正常使用。

总结(如何实现单点登录)

也就是之前的springsecurity框架源码里面的过滤器认证和成功之后的操作,现在我们不能用了,现在就要我们自己重写这个过滤器,改里面的认证规则,和验证规则。这些改之后的和JWT有关。

只要改之后,有了token,那么就可以实现单点登录了