0%

单点登录三种实现方式比较

前言

​ 单点登录(Single Sign On, 简称SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。以百度为例,如果用户在百度贴吧登录过之后,当他访问百度知道时就无需再次登录即可使用服务,而百度贴吧和百度知道是百度公司旗下的两个不同的应用系统,那么就说明百度贴吧和百度知道之间实现了单点登录。

​ 单点登录的实现方式有多种,下面来总结三种在学习过程中遇到过的实现方法:

1. Session广播机制实现

实现机制:参与集群的每个节点的Session状态都被复制到该集群中的其他所有节点上,无论何时,只要Session发生改变,Session数据都要重新被复制到其他节点上,由于每个节点都复制一份Session,当一个节点出现问题时其它节点可以接替它的工作,但是节点间进行Session复制同步会造成数据重复,占据大量的系统空间,整体性能随着集群节点数的增加而急剧下降,不适合多模块项目。

实现机制:

(1)客户端第在集群某节点一次登录时,通过服务端产生cookie和一个与之对相应的session;
(2)将第一次登录产生的User对象(即登录所需信息),以key-value的形式存储在Redis中,key存放按照一定规则生成的唯一随机值,value存储用户登录所需信息,并把生成的唯一随机值放到cookie中;
(3)当客户端再次该集群中访问另外需要登录操作的页面时,发送请求会带着cookie进行发送,将该客户端的cookie拿到Redis中根据key进行查询比对,如果存在,则视为已登录;

3. token实现

实现机制:
(1)客户端第一次在集群中某模块登录时获取登录凭证(按照一定规则生成的字符串),把登录后的用户信息经过加密后包含到生成字符串中,并把字符串返回,字符串返回的方式有两种:

  • 可以把字符串通过cookie返回
  • 把字符串通过地址栏返回

(2)客户端再去访问集群中的其他模块,每次访问在地址栏都带着生成的字符串,在访问的模块中获取地址栏的字符串,根据字符串获取用户信息,如果可以获取到就登录;