前言 在面试过程中有时候会被问到单点登录,那么单点登录又称之为Single Sign On,简称SSO,单点登录可以通过基于用户会话的共享,他分文两种,先来看第一种,那就是他的原理是分布式会话来实现。
比如说现在有个一级域名为 www.cnblogs.com
,是技术类网站,但是博客园还有其他的产品线,可以通过构建二级域名提供服务给用户访问,比如∶ ing.cnblogs.com
, news.cnblogs.com
, edu.cnblogs.com
等等,分别为博客园闪存,博客园新闻以及博客园班级等,用户只需要在其中一个站点登录,那么其他站点也会随之而登录。也就是说,用户自始至终只在某一个网站下登录后,那么他所产生的会话,就共享给了其他的网站,实现了单点网站登录后,同时间接登录了其他的网站,那么这个其实就是单点登录,他们的会话是共享的,都是同一个用户会话。
那么之前我们所实现的分布式会话后端是基于redis的,如此会话可以流窜在后端的任意系统,都能获取到缓存中的用户数据信息,前端通过使用cookie,可以保证在同域名的一级二级下获取,那么这样一来,cookie中的信息userid和token是可以在发送请求的时候携带上的,这样从前端请求后端后是可以获取拿到的,这样一来,其实用户在某一端登录注册以后,其实cookie和redis中都会带有用户信息,只要用户不退出,那么就能在任意一个站点实现登录了。
www.cnblogs.com
和 *.icnblogs.com
的cookie值是可以共享的,可以被携带至后端的。news.cnblogs.com
的cookie是不能被edu.cnblogs.com
共享,两者互不影响,要共享必须设置为.cnblogs.com
。 上一节单点登录是基于相同顶级域名做的,那么如果顶级域名都不一样,咋办?比如 www.imooc.com
要和 www.mukewang.com
的会话实现共享,这个时候又该如何?!如下图,这个时候的cookie由于顶级域名不同,就不能实现cookie跨域了,每个站点各自请求到服务端,cookie无法同步。比如,www.imooc.com
下的用户发起请求后会有cookie,但是他又访问了www.abc.com
,由于cookie无法携带,所以会要你二次登录。
那么遇到顶级域名不同却又要实现单点登录该如何实现呢?我们来参考下面一张图∶
如上图所示,多个系统之间的登录会通过一个独立的登录系统去做验证,它就相当于是一个中介公司,整合了所有人,你要看房经过中介允许拿钥匙就行,实现了统一的登录。那么这个就称之为CAS系统,CAS全称为Central Authentication Service
即中央认证服务,是一个单点登录的解决方案,可以用于不同顶级域名之间的单点登录。在CAS中的具体的流程参考如下时序图∶