SSO单点登录(Signle Sign On)
单点登录是指通过用户的一次性鉴别登录,可以获得访问单点登录系统中其他关联系统和应用软件的权限,这意味着只需要在某个系统登录一次,就可以在不需要再次登录的前提下直接访问与该系统相互信任的其他系统,这样的话能够减少用户的登录操作,辅助用户管理。
在讲单点登录之前,先来回顾一下单系统的登录。
- 用户第一次进入系统,执行登录操作
- 成功登录后在用户session中写入登录标记,同时将标记写入cookie中
- 用户再次访问系统时,请求中带上包含标记的cookie,服务端根据cookie判断登录状态,确认用户是否需要再次登录
将登录状态扩展到多个系统原理也是差不多的,只是需要对多个系统的请求都带上包含标记的cookie,这时会出现两个问题:
- cookie是不能跨域的
- 不同系统之间的session不共享
针对第一个问题,如果系统是通过一级域名下的二级域名进行区分的,可以将cookie的域升级为顶域,这样所有的二级域名都能设置cookie了。对于第二个问题,可以通过设置共享session的方式进行,具体的解决方案有很多。
但是,如果需要对不同一级域名下的系统进行登录呢?这个时候就需要cas登场了。
CAS中央认证服务(Central Authentication Service)
cas是一种独立开放指令协议,目的在于为Web应用系统提供一种可靠的单点登录方法。
根据上图我们可以简单看看其中一种cas实现的流程(cas只是一种服务协议,实现CAS的方式有很多种,这里举例的只是其中之一):
- 用户访问系统A,系统A重定向到CAS系统
- 检测到当前用户处于非登录状态,用户在CAS发起登录
- 成功登录后CAS返回ticket以及对应的系统标识A(说明当前登录的系统是A),后台验证ticket和标识通过后,用户成功访问系统A
- 在登录状态下的用户访问同样在CAS系统管辖范围内的系统B时,同样会先重定向到CAS系统
- CAS系统验证该用户已经是登录状态,返回ticket和系统标识B,后台认证ticket和标识成功后,用户即可访问系统B
在CAS干预的前提下,之前说的第一个问题就能很好的解决了。CAS登录成功之后,我们获得的是ticket,它会通过参数的形式从CAS传递到业务系统中,这个时候业务系统需要从后台向CAS发送验证请求,看ticket是否有效,验证通过之后就可以将登录状态写入session,并同时设置cookie。CAS在这里起的是一个中转和验证的功能。