通过Redis+Jwt+SpringSecurity实现
会通过请求头进行判断,当用户未登录时,请求头不带jwt签名字符串,会被
JWT 全称为 JSON Web Token,是为了在网络应用环境 间传递声明而执行的一种基于 JSON 的开放标准,主要存在 于客户端与服务端之间 [2]。JWT 实际上就是一串字符串,主 要由头部(Header)、载荷(Payload)、签证(Signature) 3 部分组成。基于 JWT 的认证流程如图 1 所示。 通过图 1 可知,通过 JWT 进行认证主要包括以下 6 个 步骤。①用户首次登录携带账号密码向服务器发送登录请求; ②服务端验证身份,根据设定的算法和 JWT 的结构生成一 个字符串 token;③服务器将 token 返回给客户端浏览器,并 在 Redis 中保存;④然后当客户端再次请求时,只需把之前 服务端返回的 token 发送给服务器即可;⑤服务器发现此次 请求中携带有 token,则验证该用户的身份;⑥服务器根据 token 中保存的信息,再将页面信息返回给客户端浏览器。
如果用户首次登录,首先 Spring Security 拦截前端提交过 来的用户账号密码信息,然后将该提交的密码使用同一种加密 方法加密后与数据库存储的密码进行比较,如果不匹配直接返 回信息给前端。如果登录成功,Spring Security 会根据用户的信 息生成 token 返回给用户,并且将该 token 存储在 Redis 中。前 端根据 Spring Security 返回该用户能访问的前端菜单动态加载页 面,以实现为不同角色显示不同的页面效果。当用户第二次登 录时,只需要带上之前服务器返回的 token,无需再次进行账号 密码验证。此时只需要从用户提交的 token 中获取该用户的用 户名,再从 Redis 里通过该用户的用户名拿到一个 token。如果 相同,则检验该 token 是否过期,如果过期则重新生成 token。
用户登录后需要对其他页面或资源进行访问,由于 token 中包含用户的基本信息和能访问的资源,因此每次访问资源时 用户只需带上 token。通过 token 获取该用户的用户名,再通 过用户名去数据库查询该用户是否有访问该 API 资源的权限, 如果有访问该资源的权限就正常执行,否则就返回无权访问的 提示
jwt的token一共有三段,这三段内容分别称为HEADER、PAYLOAD、VERIFY SIGNATURE,每一段使用一个.分割来开
第一段HEADER部分,其内容固定包含算法和token类型,这里看到加密方式是使用HS256进行加密,token类型是JWT,然后对json进行base64url加密,这就是token的第一段
第二段PAYLOAD部分,包含一些数据(一般是用户希望存储的数据,其中还会带有一个超时时间),然后对此json进行base64url加密,这就是token的第二段
第三段SIGNATURE部分,把前两段加密后的base64url密文通过.拼接起来,然后对其进行HS256加密,然后对HS256密文再进行base64url加密,最终得到token的第三段
最终,再把这三段字符串通过.拼接起来生成最终的jwt的token。
核心实现代码
引用文章
基于JWT+Spring…rity的动态权限管理系统肖双林.pdf
实现细节
流程图