同域下不同站点的SSO(跨站点)
两个站点如果在同域下,那么它们之间是可以共享cookie的。简单的说就是这种同域下不同站点的sso实现可以通过cookie来实现,当用户访问这个域下面的任意站点时,浏览器都会将这个cookie发送给站点对应的系统。
举个简单的例子:
站点1:www.ssotest.com/site1
站点2:www.ssotest.com/site2
从上面可以看出,这两个站点是在相同域名(www.ssotest.com)下,那么从站点1登录时,会在浏览器存储一些cookie,当在站点1下做任何操作时都会将这些cookie发送给站点1,同理,当访问站点2时,由于站点2和站点1在同一个域名下面,所以也会将这些cookie发送给站点2,所以这样的话就能够实现SSO了。可参考图1:
图1 利用cookie实现同域不同站点单点登录图
同域但不同子域名的SSO(跨子域)
指相同父域,但是不同二级域名的单点登录,例如如下有两个站点:
subsite1.ssotest.com
subsite2.ssotest.com
从上面可以看出,它们的父域都是.ssotest.com,但是它们的二级域名不相同,所有如果在subsite1站点直接创建cookie,那么subsite2站点是不能够获取到subsite1的cookie的,所以如果直接在subsite1站点登录,将无法实现单点登录,那么如何才能实现这种情况的SSO呢?
实现它们之间的SSO最关键的一点是:实现cookie共享和session共享,保持二者的sessionId相同。
解决方案如下:
1.如果是使用的spring boot框架的后台应用,只需要在application.properties配置文件中添加上如下配置即可(因为内嵌tomcat):
server.session.cookie.path=/
server.session.cookie.domain=.ssotest.com
注意:server.session.cookie.domain不能设置为公共后缀,比如:.com,.cn
2.如果使用外部tomcat,那么需要在server.xml文件中添加如下配置:
不同域的SSO(跨域)
要实现这种跨域方式的SSO,有两种方式:
1.使用cookie,在各个应用之间重定向
2.使用单独的SSO服务器(更优)
那么下面详细的介绍上面这两种方式,以如下三个站点(应用)来具体描述:
www.site1.com
www.site2.com
www.site3.com
第一种方式:凭借cookie,应用间的重定向
这种方式比较简单,当用户在上面三个站点中的任意一个站点登录成功时,必须在浏览器中同时设置其他站点的cookie信息。
例如:当用户登录site1站点,并且验证通过之后,浏览器会存储一份site1站点的cookie信息,这时,为了实现单点登录(为了在site2站点和site3站点无需登录),那么我们需要在浏览器设置site2站点和site3站点的cookie信息,因此,在用户登录site1站点的请求响应之前,需要从siteId1站点重定向到site2站点和site3站点去设置cookie信息,这样就可以保证,在任意站点登录成功之后,在浏览器也有其他站点的cookie信息。下图2可具体展示其中流程:
图2 cookie结合重定向实现跨域SSO
这种方式其实过程比较简单,只需要确保登录其中一个站点在浏览器设置cookie其他站点都在浏览器设置对应cookie,就可以实现单点登录了(单点退出是一样的道理,一个退出清除cookie,其他也清除)。
但是这种方式有一个非常明显的缺点是:这里举例是3个站点,如果是几十个上百个站点再使用这种方式将非常影响效率。
第二种方式:借助单独的SSO服务器
这种方式需要借助一个单独的SSOServer,相对于上一种方式,这种方式就不需要将每个站点的cookie信息都保存在浏览器上,浏览器只需要保存SSOServer的cookie信息。将这个cookie信息用于需要做单点登录的所有站点中。
对于这种方式,在浏览器对于任意一个站点的请求都将会先重定向到SSOServer去验证代表当前用户的cookie是否存在,如果存在,那么将验证成功后的跳转页面发送给浏览器,否则将跳转到登录页面提示用户登录。可参考如下图3模型:
图3 借助SSOServer实现单点登录模型
由于site1和site2的单点登录与site1、site2、site3之间的单点登录是同样道理的(因为登录site1后去访问site2和site3的流程都是相同的),所以,这里借助site1和site2的单点登录来说明这种方式。
下面分为三部分(三张图)来说明这种方式的单点登录:
第一部分:未在SSOServer登录,浏览器请求site1需要验证的页面,在SSOServer获取不到cookie,被重定向到site1登录界面,提示登录,流程如下图4:
图4 SSOServer未登录拦截请求流程图
第二部分:site1的SSO的登录以及响应流程,如下图5:
图5 site1的SSO的登录以及响应流程
第三部分:site2的SSO的登录以及响应流程,由于此时SSOServer已经登录了,所以不需要再次去SSOServer登录,只需要根据cookie去拿到token,去验证token有效性,如下图6:
图6 SSOServer登录之后的其他站点登录流程图
在SSOServer登录的情况下,其他所有站点的登录情况都如site2,图6所示的流程,可见使用SSOServer的方式会方便许多。
以上就是SSO三种情况的实现方式。