什么是单点登录
在许多企业刚刚起步时,内部不会有太多的系统,员工要进行操作时只需要登录系统即可,非常的方便。但当企业逐步发展壮大时,各个系统数量的增加,导致员工如果想跨系统进行操作时需要重新登录对应系统才能进行操作,变得非常的繁琐。
出现单点登录就是为了解决这一问题,想要实现登录一个系统之后就可以“畅玩”其他所有系统而无需再登录。
单点登录(检查SSO),它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
在正式讲解单点登录之前我们先来看看传统系统登录:
登录模型中,用户想要访问某系统应用资源得先登录对应系统,在浏览器中输入用户信息,提交到后台通过验证之后,会保存Session以存储用户登录信息,并且向浏览器写入cookie,用户第二次访问时会携带cookie,在后台会根据cookie找到对应session信息,这样就不用再次登录。
单点登录实现
单点登录的实现又可以分为同域单点登录和不同域单点登录
同域单点登录
首先,什么叫同域呢?我理解就是在同一顶级域下的访问操作就叫同域访问,例如,有一顶级域xer.com(一级域名),那么a.xer.com、b.xer.com就属于xer.com的子域(二级域名),a.xer.com、b.xer.com就属于同域
同域的单点登录面临的问题就是cookie是不能跨域的,并且每个系统应用的session都是放在各自内部,无法实现共享。如上图所示,我们有四个系统应用,sso、pay、add、clean,sso属于登录系统,其他系统中都没有登录功能,用户通过sso实现登录其他三个系统。但是面临的问题就是:例如用户想要访问pay应用,通过sso进行登录之后,sso生成了自己的session,并向浏览器写入保存了sso域的cookie,此时是无法实现携带sso域的cookie访问pay域的所以登录也就无法实现。
解决:利用顶级域特性,实现所有子域间访问。实现session共享。session共享实现方式可以参照:https://www.jianshu.com/p/023a94df16ea
不同域单点登录
在同域单点登录中我们利用了顶级域的特性,但是不同域却是无法实现cookie的传递,那要怎么实现呢?通过CAS实现。
CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法。
上图是CAS官网流程。CAS分为Server和Client,Server主要负责认证、验证成功颁发service ticket,一般单独部署。CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。
对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,会向 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。
具体流程解释如下:
1. 用户登录,发现没有登录转发到CAS,并把当前应用1回调接口作为参数传递(经过编码),方便验证完成后回到回调地址继续处理。
2. 到达CAS后发现用户没有用户SSO session,返回登录页面给浏览器,用户填写登录信息,进行验证
3. 验证成功,创建 SSO session保存登录信息,并生成sessionKey保存到cookie中,同时会生成一个类似令牌的ticket作为参数返回给浏览器
4. 浏览器拿到响应,携带ticket再次访问应用,应用1接口会先拿着ticket去询问CAS是否有效(同样的会携带回调地址参数),验证有效后CAS会返回成功
5. 接口回调中保存用户登录信息,生成session,同时在浏览器中写入cookie。后面再访问应用1时会携带cookie,则无需再次登录。
6. 访问应用2或者其他应用时,同样的先到达应用2接口会先去向CAS验证ticket是否有效,验证成功,通过SessionKey获取Session信息,返回页面