SSO系统登录设计

465 阅读4分钟

前言

在公司发展初期,公司只有少量的系统,通常就一到两个,每个系统都有自己的登录逻辑,用户对于每个系统有自己的账号。

随着后期系统越来越多,对于用户记录多个账号信息会很困难,那么需要统一的账号体系,各个系统使用相同的账号登录。

每个系统虽然使用相同账号登录,但是用户还是需要分别登录每个系统,那么特别不方便,这时候提出一种诉求,用户需要登录一次,就可以访问所有其他的系统,这便是SSO。

单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统

内容

A+B 系统登录

登录A系统,B系统自动登录,同理登录B系统A系统自动登录

前提AB系统需要相同的账号和密码。

1、A,B系统不同域

A+B请求跨域.png

  • 用户登录A系统时,前端JS同时发起一个跨域请求登录B系统。
  • 用户登录B系统时,前端JS同时发起一个跨域请求登录A系统。
  • 需要两个系统同时维护一段前端登录逻辑,增加一个系统,就要在每个系统维护写一份登录逻辑。
  • 退出也是一样的,每个系统需要维护一份退出逻辑

2、A,B系统同域

A,B系统能够共享session,session 要放在A,B系统都能访问的数据库里面,比如redis,memcache,mysql。

A+B登录不同域.png

  • A系统登录之后,在根域下写入session,访问B系统时候,B系统可以获取A系统的session,B系统就不需要在登录了。
  • B系统登录之后,在根域下写入session,访问A系统时候,A系统可以获取B系统的session,A系统就不需要在登录了。
  • 需要A,B系统同域,且维护共同的session信息。
  • 退出的时候,只需要任意系统销毁session就可以了。

总结 同域的情况下,那么更容易实现单点登录逻辑。

A+B+用户中心

A系统+B系统+用户中心,用户中心指的是用账号管理中心,管理用户账号和密码

1、A,B,用户中心不同域

A,B系统分别用户中心验证登录权限,且系统之前无法共用session信息

A+B+用户中心不同域.png

  • 用户访问系统A,系统A监测到用户未登录,跳转用户中心登录,用户登录之后,用户中心重定向到系统A,会跳地址携带用户中心颁发的凭证ticket,系统A后台访问用户中心验证ticket,ticket有效则建立session。
  • 用户访问系统B,这是监测到请求地址携带用户中心的ticket,后端去验证ticket有效性,校验无误之后建立session,如果未携带ticket,那走上一步逻辑系统A登录逻辑
  • 退出时,需要系统之间发送跨域请求,调用其他系统退出逻辑,完成各自系统session销毁问题。

2、A,B同域,用户中心不同域

A,B 同域可以,那A,B系统可以共享session,退出时,任意系统销毁session便可。

3、A,B,用户中心都同域

A,B,用户中心都同域,那么用户中心可以创建session,和A,B系统共享,退出时,任意系统销毁session便可

A+B+认证中心

认证中心和用户中心的区别在于认证中心只管认证用户信息,而不维护用户登录状态。

1、认证中心登录流程

单个系统sso登录流程,对于多个系统只需要解决session是否共享的问题就可以了。

sso认证中心登录逻辑.png

2、A,B系统同域

A,B系统同域的话,session 可以共享,不管A,B系统那个系统登录,都可以访问另外一个系统都可以登录,同理不管哪个系统销毁session其他系统会退出。

3、A,B系统不同域

  • A 系统登录之后,会获取到ticket,A系统验证ticket通过建立会话 。
  • B 系统使用A系统的ticket系统同样可以验证,验证通过也可以建立会话 。
  • 在有ticket的情况话,是不需要跳转认证中心登录的,ticket验证在系统后端访问认证中心便可以,对于用户是无感知的。

总结

SSO 登录要解决两个问题,用户账号打通,使用认证中心或者用户中心,或者系统之间人工同步账号信息。 解决session问题,同域共享session和非同域不共享session问题,退出时共享session情况下,任意系统销毁session便可,非共享session,需要系统之间发送跨域请求销毁各自的session信息。