单点登录的理解(SSO)

写在前面

本文上将单点登录的实现,以及本人的理解写出来,仅供参考

单点登录概念

  • 这里要区别于分布式会话,分布式会话是在一个系统中,一个大的域名下的众多子域名中共享会话
  • 而单点登录,是在一个集团下,多个不同域名的系统进行共享登录状态(这里不是会话哦),实现一个登录,个个登录
  • 在这里插入图片描述
  • 用这样的图来表示,不同的系统域名是不一样的,且不具有父子域的关系,同时,它们的上级域名是.com,所以根本没有办法参考分布式session,把cookie的domain设置成父域来解决
  • 所以这里采取的方式是,抽取出一个系统,单独的作为认证中心,所有的系统都信任该认证中心

单点登录实现流程

  • 这里,我将系统都称为客户client,客户!=用户
	成员:server clientA clientB 浏览器
	- 浏览器访问clientA,clientA检查:
		有无session登录信息,有则直接通过
		请求路径中有无token信息,有则向server查询该token,获得用户信息,如果成功,则通过,并且将用户信息放到自己的session中
	- 以上都失败,clientA以自己的地址作为回调地址(之后算是重新请求),放入url,让浏览器重定向到server,进行统一登录
	- server检查:
		如果有token,则将token在redis中查询对应用户信息,如果查询到,则将token返回给客户的回调地址,等待客户进行查询
	- 如果以上失败,说明该用户从未登录过,则进行登录操作,返回给浏览器登录页面
	- 浏览器输入登录信息,交给server
	- server进行验证,登录成功后,做三件事
		首先将为用户生成的token放到自己的session中
		然后以token为key,用户信息为value,存入redis中
		将token返回给回调地址
		
	在clienA登录过的情况下,浏览器第一次访问clientB
	- 浏览器访问clientB,clientB发现没有session中的用户信息,也不携带token
	- clientB让浏览器重定向到server,加入clientB的回调地址
	- server发现该请求中cookie里有token,则将token查询到用户信息,返回token给回调地址
	- clientB收到token,进行查询,然后获得用户信息
	- 将用户信息放入自己的session,然后通过登录

关于单点登录的理解

  • redis是只有server用的,而token是为了获取用户信息的。客户不能访问redis,这也一定程度上保证了安全性
  • 任何系统的登录都需要经过server,这种全权委托第三方server来进行认证,才能实现单点登录,对于每个系统而言,server是它们信任的机构
  • 登录完成之后,server给客户返回token。而客户为了确认用户信息,需要拿这个token再次向server进行查询。
  • 只要当前系统中没有用户信息,就交给server来进行处理。
  • server为了识别用户,所以在自己的域名下加入了cookie,cookie信息就是token,这样才能识别用户状态。同时,基于哪里不会就交给server来处理,server总能接收到用户的登录请求。
  • 客户重定向给server之前,都会在url中添加自己的回调地址,从而使得server处理完正确登录之后能够跳转回来,同时跳转回来时,会带上token

参考资料

尚硅谷视频

猜你喜欢

转载自blog.csdn.net/qq_34687559/article/details/116353931