实现方式
- 父域Cookie,只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了
- 不过这要求应用系统的域名需建立在一个共同的主域名之下,如 http://tieba.baidu.com 和 http://map.baidu.com,它们都建立在 http://baidu.com 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
- 此种实现方式比较简单,但不支持跨主域名。基本没戏。。
- 认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web 服务。用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的。)
- CAS、XXL-SSO都是这种类型
- 此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法
- 第三方登录
- QQ登录、微信登录、微博登录等
基本上所有的SSO系统,所会对CAS有所借鉴。
TO B、TO G类的项目选用CAS或者类似的较多
TO C选择OAuth(QQ、微信第三方登录)较多
认证流程
首次访问受限资源时
- 首次访问时,重定向到SSO服务端登录页,返回登录表单给浏览器。
- 用户提交用户名密码,SSO服务端验证
- 成功后,SSO服务端写全局cookie,携带ticket,重定向会SSO客户端
- 客户端与SSO验证ticket有效性,返回验证信息
- SSO客户端写局部会话cookie,重定向回原地址,业务系统返回资源。
如果登录,直接跳转,即执行:
response.sendRedirect(urlToRedirectTo);
第二次访问该系统
第二次访问该系统,会在该域名下存在上一步写的cookie,请求该系统时携带cookie,所有filter不会拦截该请求,直接返回资源。
首次访问其他系统
在该系统域名下不存在局部会话,所以重定向到SSO服务端,SSO服务端会发现此客户端已经登录,所有生成ticket,客户端与SSO验证ticket有效性,返回验证信息,SSO客户端写局部会话cookie,重定向回原地址,业务系统返回资源。
总结
- CAS即有一个单点认证服务
- 同一个系统,第二次免登录是由局部Cookie实现。
- 这个可以自定义不适用Cookie也行。
- 不同的系统,只需登录一次,是由全局Cookie实现。
- 这一步一般不能改,只能是Cookie,使用浏览器自动携带属性
- (实际做项目不是这么死板,可以不用cookie,也可以不用局部cookie 所有都使用全局token)