在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,这种设计称为单点登录。
环境
随着公司的不断壮大,公司的服务体系不断扩建,多个服务体系间都有自己独立的登录登出功能。如果出现服务体系间跳转,需要重复登录。
单个服务的验证
- client端输入用户名密码请求server端
- server端校验通过后,生成sessionId放到session中,同时在浏览器中写入cookie
- client端后续请求都会带上这个cookie给server端
- server端校验session的合法性,若不是合法则提示错误
同域下的单点登录
企业一般只有一个域名,通过二级域名区分各个系统。比如公司域名为a.com,同时有2个业务系统分别为app1.a.com和app2.com,单点登录的系统为 sso.a.com
- 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流程了
- 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
- sso认证中心发现用户未登录,将用户引导至登录页面
- 用户输入用户名密码提交登录申请
- sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌
- sso认证中心带着令牌跳转会最初的请求地址(系统1)
- 系统1拿到令牌,去sso认证中心校验令牌是否有效
- sso认证中心校验令牌,返回有效,注册系统1
- 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源
- 用户访问系统2的受保护资源
- 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
- sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
- 系统2拿到令牌,去sso认证中心校验令牌是否有效
- sso认证中心校验令牌,返回有效,注册系统2
- 系统2使用该令牌创建与用户的局部会话,返回受保护资源
不同域名下的单点登出
- 用户向系统1发起注销请求
- 系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
- sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址
- sso认证中心向所有注册系统发起注销请求
- 各注册系统接收sso认证中心的注销请求,销毁局部会话
- sso认证中心引导用户至登录页面