Springboot单点登录的实现

137 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

什么是单点登录

只需要登录一次就可以访问所有的子系统。


基于Session实现单点的登录

  • Session的特性:

    1. 储存JSESSIONID在客户端
    2. 相同的域能够读取到数据
    3. 服务端保持Session会话
  • 理论基础
    通过子系统使用相同的域来实现:

    • A、B、C三个系统
    • A的域名为 a.bb.com
    • B的域名为 b.bb.com
    • C的域名为 c.bb.com
    • 那么将Cookie的域设置为 bb.com 。在访问A、B、C任何一个系统的时候都会带Cookie过去
  • 具体实现

    • 由于时间原因而且这种按照理论基础来实现没有太大的障碍。提一点在登录的时候最好加上?form=xxxx 进行登录成功后的跳转。

基于jwt实现单点登录

  • 什么是jwt:json 格式的数据,组成的web端,使用的令牌。
    1. jwt由三段 json格式 数据组成:header、payload、singnature

      • header:标头,该 json字段 包含{typ:"JWT",alg:"HS256"}。定义令牌类型和加密算法
      • payload:负载,该 json字段 包含自定义到客户端的数据。
      • singnature:签名,用于防止令牌被篡改。不是json字段。是标头和负载各自的base64编码后加上服务器端才知道的盐值,经过标头定义的加密算法加密出来的值构成
    2. 如何拼接

      • Base64(标头).Base64(负载).签名
  • jwt如何实现登录验证
    1. 用户登录成功后,根据上面的三段拼接出jwt,返回给客户端存储。

    2. 用户访问需要授权的资源时,需要带上jwt。服务器进行下面的验证

      • 通过 . 分割客户端传的jwt

      • Base64解码(第一部分),获取标头部分。拿到加密算法

      • 将第一部分+第二部分+服务器生成jwt时使用的盐值,根据上面获取到的加密算法得出singnature部分。和分割的第三部分对比。判断jwt是否有效

      • 若有效,且使用了jwt框架或自己在负载加上了过期时间,则判断jwt是否过期

      • 若没过期,就可以Base64解码(第二部分),获取用户相关登录数据(userid等等)

        image.png 验证过程中常见异常

  • jwt的优缺点
    1. 缺点:

      • 需要额外处理jwt超时
      • 需要额外主动注销
      • 每次请求都有解码操作
    2. 优点:

      • 存储在客户端,服务器存储压力无
      • 利于多系统分布式
      • 可以自定义任意数据