在项目中前前后后也遇到过几次单点登录的需求,有些实现方式可能并不是也别规范,也存在一些问题。但还是在这里把之前项目中遇到过的一些单点登录实现方案做了个总结和归纳。

什么是单点登录

  • 单点登录英文全称Single Sign On,简称就是SSO。

  • 它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。

image-20201008231842150

  • SSO实现效果:当子系统需要登录时,系统跳转到sso登录页面;当sso登录以后,可以访问任意子系统

单一系统的登录

image-20201008233436280

  • 用户进入系统后,通过向后端发送token后者cookie(cookie里面存放的一般情况下是SessionId)的方式,校验用户是否处于登录状态,若处于登录状态,认证通过,进入系统
  • 若用户处于未登录状态下,则跳转登录页面,用户输入用户名密码后,有后端返回token或者写回cookie,完成用户登录
  • 用户退出登录时,向后端发送请求,同时清除前端token或者cookie的信息,即可完成用户登出

单点登录实现方案

  1. cookie共享机制实现sso

    • IP + 端口号部署

      image-20201009000953906

      • 用户进入子系统时,前端会向服务端发送cookie,若cookie有效进入子系统,若cookie无效,跳转uic登录页面
      • 登录页面用户登录成功后,后端会写回cookie,并登录用户中心。当用户访问子系统时,通过cookie共享机制,能把cookie带给服务端
      • 误区:cookie是不能够跨域共享的,但浏览器实现的时候没有区分端口。因此对于cookie来说,同一个IP下,不同端口之间是能够进行共享的。
    • 域名方式部署

      image-20201009002142669

      • 通过域名方式部署时,理论上是不同源的,域名不同,cookie是无法共享的。但cookie可以是设置domain,只要设置在.lzgcyz.com域下共享,就能够实现子域名共享
  2. 通过传递token的方式实现

    image-20201009003817975

    • token可能会直接暴露在浏览器URL中
    • 另一方面需要考虑浏览器get请求支持的最大字符数
  3. OAuth2实现标准的单点登录

    image-20201009010640170

  • 用户直接访问子系统,若子系统中存在cookie或者token,且有效的情况下,直接访问;若认证失败,则先调用后端接口,获取重定向URL,跳转sso鉴权页面
  • 当进入鉴权页面时,校验sso系统登录状态,若sso登录成功,后端会返回一个重定向URL,带上授权码回跳子系统;若sso系统未登录,则会带上参数(可以通过query参数,或者另外的方式传递到登录页)跳转系统登录页。
  • 跳转登录页后,用户登录成功后,会带上参数跳转sso鉴权页面,此时sso已登录,后端会返回重定向URL,带上授权码,回跳子系统
  • 用户登出,子系统登出后需要保证sso系统退出,此时登出可能需要后端完成,也可能需要前端完成。

Oauth2可参考相关文章理解OAuth 2.0


单点登录方案对比

概述
cookie共享 受同源策略影响(适用于IP地址相同,端口不同或者部署域名顶级域名一致的情况)
token传递 token直接暴露在浏览器地址中,可做一次重定向处理,需要考虑get请求长度限制
OAuth2 比较标准化,但处理也稍微麻烦些