学习是件开心事

sso单点登录

在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,这种设计称为单点登录。

环境

随着公司的不断壮大,公司的服务体系不断扩建,多个服务体系间都有自己独立的登录登出功能。如果出现服务体系间跳转,需要重复登录。

单个服务的验证

image

  • client端输入用户名密码请求server端
  • server端校验通过后,生成sessionId放到session中,同时在浏览器中写入cookie
  • client端后续请求都会带上这个cookie给server端
  • server端校验session的合法性,若不是合法则提示错误

同域下的单点登录

企业一般只有一个域名,通过二级域名区分各个系统。比如公司域名为a.com,同时有2个业务系统分别为app1.a.com和app2.com,单点登录的系统为 sso.a.com
image

  • app1和app2如果没有登录都去sso进行登录
  • sso登录成功后, 将cookie设置成一级域名a.com ,然后重定向到app1.a.com或者app2.a.com
  • app1.a.com或者app2.a.com从一级域名拿到cookie后,调用sso校验session的合法性
  • 如果不想通过sso校验session,而是想通过各自的服务校验的话,则所有服务需要共享session

不同域名下的单点登录

同域下的单点登录是巧用了Cookie顶域的特性。如果是不同域呢?不同域之间Cookie是不共享的,那就需要用到cas流程了
image

  • 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  • sso认证中心发现用户未登录,将用户引导至登录页面
  • 用户输入用户名密码提交登录申请
  • sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌
  • sso认证中心带着令牌跳转会最初的请求地址(系统1)
  • 系统1拿到令牌,去sso认证中心校验令牌是否有效
  • sso认证中心校验令牌,返回有效,注册系统1
  • 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源
  • 用户访问系统2的受保护资源
  • 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  • sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
  • 系统2拿到令牌,去sso认证中心校验令牌是否有效
  • sso认证中心校验令牌,返回有效,注册系统2
  • 系统2使用该令牌创建与用户的局部会话,返回受保护资源

不同域名下的单点登出

image

  • 用户向系统1发起注销请求
  • 系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
  • sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
  • sso认证中心向所有注册系统发起注销请求
  • 各注册系统接收sso认证中心的注销请求,销毁局部会话
  • sso认证中心引导用户至登录页面