随着架构的演进,从大杂烩到现在的微服务,架构发生了变化,那自然很多的东西也要随之改变,今天我们来说一说这个单点登录又是什么东西.

  首先在分布式的结构下,一个项目被拆分成不同的微服务,每个微服务之间做着自己分内的事.然而有些需求却需要贯彻这整个项目,比如说登录,用户在一处登录后,访问项目中的每个微服务所管理的部分都应该实现已登录功能,在传统的单一服务器登录中,我们可以实现用session存值,通过判断session中是否有值,在进行判断用户是否登录.但是在微服务架构中是不能做到的.

  所以进行就有了单点登录,实现了在任何一个模块中登录了,其他模块都能再去访问,不需要二次登录

早期单一服务器,用户认证。

在这里插入图片描述缺点:单点性能压力,无法扩展

SSO(single sign on)模式:
分布式,SSO(single sign on)模式
在这里插入图片描述优点 :

用户身份信息独立管理,更好的分布式管理。
可以自己扩展安全策略

缺点:

 认证服务器访问压力较大。

下面我们来说说单点登录的是那种常见方式
第一种:session广播机制实现

session复制,在某一个模块登录了,就在其他模块复制session,实现在其他模块的登录
缺点:模块较多时,耗资源.数据重复,浪费空间
第二种:使用cookie+redis实现
技术点:cookie.,redis.
cookie客户端技术:每次发送请求带着cookie值进行发送.
redis:根据key,得到值
1.在项目中的任何模块进行登录,登录之后,将数据放到两个地方
(1)redis中在key(生成随机的id值),value(用户数据)中放值
(2)cookie:把redis里面生成key值放到cookie中
2.访问项目中的其他模块时,发送请求带着cookie进行发送,获取cookie值,拿着cookie值做事情
i: 回去cookie获取值,到redis进行查询根据key进行查询,如果查询到了value,那就有表示已经登录了,反之则没有
第三种:使用token实现
token:按照一定的规则生成一串字符串,字符串可以包含用户信息.
(1)在项目中某个模块进行登录的时候,登陆之后,按照规则生成字符串,把登录之后用户包含到生成字符串里面,把字符串返回

1.可以把字符串通过cookie返回,
2.可以把字符串通过地址栏返回

(2) 再去访问项目中其他模块,每次访问在地址栏带着生成的字符串,在访问模块里面获取地址栏字符串,根据字符串获取里面的用户信息
业务流程图{用户访问业务时,必须登录的流程}
在这里插入图片描述优点:
无状态: token无状态,session有状态的
基于标准化: 你的API可以采用标准化的 JSON Web Token (JWT)
缺点:
占用带宽
无法在服务器端销毁
注:基于微服务开发,选择token的形式相对较多,因此我使用token作为用户认证的标准

我们都知道session是可以设置过期时间的,
但是第二种第三种是怎么实现登录的呢?

redis自己有过期时间设置,
而token也是有可以设置过期时间的.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐