这个文章我们来讨论一下单点登录SSO的一些实现方式,其中包括对session和cookie的一些讨论。
一、
我们知道http协议是无状态的协议,也就是说一次请求对应一次响应,不和这次请求的上一次和下一次请求产生关联。那么这样就有一个问题,比如说,我们想实现一个购物车,我们往购物车中添加商品,每次刷新发现上一次添加的商品不见了,每次购物车里都是这次添加的商品,前面添加的不见了。为什么?就是因为http是无状态协议,它压根不知道你上一次往购物车里添加了什么商品。那么我们要怎么做才能让购物车保存我们前面添加的商品?那么,我们首先要让服务器知道”你就是你“。
举个例子,比如说现在有两个人user1,user2在往购物车里添加东西。user1添加了A,B商品,user2添加了C,D商品,此时user1想看看自己到底往购物车里放了什么商品,于是user1点了一下购物车的图标,服务器收到请求,有个用户要查看购物车的商品,要把购物车的商品返回给用户。那么到底是返回user1的还是user2的呢?也就是说服务器凭什么知道这次请求来自user1(把user1的购物商品返回)呢?
那么是不是说我们让我们的浏览器和服务器之间通过一个凭证来通信就可以解决。还是那上面的例子来说。比如user1登录了这个购物网站,服务器收到了这个请求,然后告诉user1说我给你一个凭证(card1),你下次请求的时候拿着这个凭证来请求,这样我就可以知道你是user1了。同样的,user2也登录了这个网站,服务器也给user2一个凭证(card2)。这时user1说想看一下我购物车里的东西,还是点了一下购物车,不同的是,点的同时把这个card1凭证给了服务器。此时服务器收到请求,有个用户要看购物车的商品,并且这个用户有card1凭证,也就是说这个请求来自user1,那么服务器就很懂事的把user1的商品(A,B)返回。同样的,user2也想看一下购物车,点了购物车的图标,把card2凭证给服务器,服务器知道通过card2请求知道这次请求来自user2,也很懂事的把商品(C,D)返回。这样一来服务器就很清楚的知道了这次请求来自哪个用户了。
上面只是一个非常简单的例子,这种让服务器知道这次请求来自哪个用户的机制叫做会话机制(session)。我们用tomcat服务器来说明。当我们访问某个应用时,服务器会产生一个session来保持会话,session存在与服务器中。也就是这个请求的用户和服务器产生的通信凭证。然后会设置一个cookie(cookie是属于浏览器,存在硬盘中的),tomcat服务器设置cookie的key叫”JSESSION“,value值是这个session的id。浏览器会把这个cookie存在浏览器中,下次再访问这个应用的时候捎带也会把这个cookie带上,那么当服务器收到请求时,把这个cookie中名为”JSESSION“的id取出来。服务器拿到这个id,就从拥有这个id的session的内存中取用户的信息,比如用户的购物商品。下图为请求某个java应用时的JSESSION。
这样一来服务器就知道了这次请求来自哪个用户。请求响应的过程如下图:
二、
接下去我们进入正题,讨论一下单点登录SSO。上面那种是单应用模式,一个应用就一个登录,相对简单。但是当我们的应用群增大,n个应用时,是不是就意味这我们每次都要分别登录这些应用。试想一下,你们公司一个有4个系统,然后你每次上班,打开浏览器,首先进入系统1,登录一下,在打开一个标签页,进入系统2,登录一下。。。是不是很麻烦,我们希望的是我们登录了系统1,然后再用其他系统的时候不用登录,相当于一个系统一样。这就是单点登录SSO。下面我们讨论一下单点登录的实现方式(3种)。
方法一:利用cookie的域实现
我们上面讲到,浏览器会设置cookie,cookie中保存中和服务器通信的session id。但是cookie是有限制的,限制就是域(网站的域名),浏览器发送http请求时会去匹配,当请求的地址和cookie的域相匹配时,就会把这个cookie携带,不匹配就不携带。这样就好办了。比如我们有两个系统要做单点(~~),我们我们让这两个系统的域名保持一致不就行了,比如A系统域名:www.myapp.A,B系统域名www.myapp.B设置的时候这是cookie的域为www.myapp,那么访问A,B系统时都会携带这个cookie,也实现了单点。以前的系统很多都是这么做单点登录的,优点就是简单方便,缺点就是不够动态,首先域名要统一,其次,web服务器还得统一,tomcat是JSESSION,php,.net服务器就不是JSESSON了。
方法二:增加业务应用实现
还是有两个系统要做单点(系统A,B),我们可以不用cookie来实现单点,增加一个系统注册应用(系统C)。把系统A,B的功能模块全部注册到系统C中,同时关联账号,系统C的 user1 关联系统A的 userA1,关联系统B的 userB1,同时登录的入口唯一,即只开放系统C的登录。那么我们user1登录了系统C,同时要访问系统A的某个模块,我们就可以跳转到系统A,同时在系统A中创建userA1的session,要访问系统B的某个模块,我们就可以跳转到系统B,同时在系统B中创建userB1的session,这样也可以实现单点。优点就是比较适合后台管理类,权限多的应用。缺点就是相对复杂。如下图:
三、通过认证中心实现
现附上我参考的文章:认证中心SSO (三、单点的登录 部分)
这一部分已经讲的非常详细,但是没有练习的例子,我会在后续更新,依照这个过程写一个例子,分享出来~
以上就是我对SSO实现的一些讨论。
来源:CSDN
作者:TangXW_
链接:https://blog.csdn.net/qq_30788949/article/details/79002652