JWT实现单点登录(SSO)

目录

一、理论

1.SSO

2.JWT

#.组成 

#.如何工作

3.Redis   RSA   MD5

4.AOP

二、实现过程

#.准备工作

#.登录

#.测试类

#.插拔式注解

#.测试



最近有机会接触到了单点登录,写一篇文章记录一下整个实现的流程。

技术名词

  1. SSO (SingleSignOn 单点登录)
  2. JWT(Json web token 一种认证协议)
  3. Redis(Remote Dictionary Server 远程字典、非关系型数据库、高速缓存中间件)
  4. AOP(Aspect Oriented Programming 面向切面编程)
  5. RSA  MD5 (加密算法)

一、理论

1.SSO

[图片来源于网络,版权归原作者所有,如有侵权,请告知立即删除]

举一些例子:登录了淘宝,进入之后点击天猫不用重复登录。最常用的百度,只要登陆了,进入其他应用如百度文库、贴吧等都是不用重复登录的。

总结:一处登录,处处登录,一处注销,处处注销。

再详细点:客户端请求需要携带TOKEN(内有用户信息等)才能访问一些登录后才能访问的URL,如果不传递TOKEN或者是过期以及被篡改都是不能通过校验的,就会让用户重新登录,登录成功之后服务器会返回TOKEN给客户端,客户端只要携带这个TOKEN就可以访问其他分布式的系统(这些系统都可以识别TOKEN),如果注销,TOKEN被删除,则会要求用户重新登录。

2.JWT

#.组成 

格式:xxx.yyy.zzz

  • Header
    • 两部分组成:token的类型("JWT")和算法名称(如:SHA256或者RSA)
    • 用Base64对这个JSON编码就得到JWT的第一部分
  • Payload
    • 它包含声明(要求)声明有三种类型: registered, public 和 private。
    • registered :预定义声明,不是强制的,一般jwt会包含创建时间以及销毁时间
    • public:可以定义你想存到jwt里的信息,如用户的id、userName、email等,一般不存敏感信息,除非你通过加密让此这部分信息变得可靠。
    • 对payload进行Base64编码就得到JWT的第二部分
  • Signature
    • 这是一个签名,拥有防篡改等功能,三个组成部分
    • base64UrlEncode(header)      →  x
    • base64UrlEncode(payload)     →  y
    • secret   →  z
    • 以上三部分作为参数,通过签名算法(header中的算法名称)对它们进行签名(x与y通过 . 连接,加盐z 组合加密),如 HMACSHA256(x+"."+y , z)

#.如何工作

在认证的时候,用户通过凭证成功登陆之后,服务器会返回一个一个jwt(TOKEN)给前端,在此之后,它便是用户的凭证了,在每一次的访问上,可以在请求的Header上携带这个凭证,在服务器上受保护的路由会验证此TOKEN。别忘了一点,jwt是可以携带信息的,如用户的账户类型,通过此也可以做权限管理,如果jwt携带足够多的数据,可以减少不必要的数据库访问。

3.Redis   RSA   MD5

Redis是什么就不介绍了,主要说一下我在实现的过程中充当的作用。

  • 存储RSA公私钥
    • 公私钥需要不断变化,使用户登录输入的密码在前端加密之后不会每一次都相同
  • 存储用户的TOKEN
    • 用户的凭证验证通过Redis
    • 设置TOKEN的有效期

4.AOP

面向切面编程,通过阅读代码能够获得更好的理解。

二、实现过程

#.准备工作

创建一个授权中心(一个普通的SpringBoot项目即可)

按照正常的创建流程创建好之后,创建LoginController用作入口。

  • 引入jedis并配置连接池
    • 引入相关的包:redis.client.jedis
    • 修改配置文件
      • #带有"#"符号的需要手动填写
        spring:
          redis:
            database: 0
        #    host: 000.000.000.000
        #    port: 6379
            connect-timeout: 5000
            jedis:
              pool:
                max-active: 8
                max-idle: 8
                min-idle: 0

         

    • 添加配置文件,附配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值