00:00
就是刚才呢,我们介绍概念单点登录啊,下面咱们说它具体该怎么实现,首先啊,咱看个地方啊,就这个这个单词叫single sign on。它的简称叫SSOSSO指的是什么?就叫单点登录啊,因为这个要各位要记住啊,比如说啊,以后在面试中,别人可能问你说你们项目的单点登录怎么做到的,那咱直接回答一会我讲这些足够了。但是有的面试官他可能不是直接问,他问你,他可能换一种问法,说你们项目中的SSO是怎么做到的?你不要说听不懂啊,SSO是什么?就是咱说的单点登录,指它英文的简写,不同的说法,SSO单点登录啊,这是一个意思,就是一个中文一个英文,不管别人说什么,然后你知都知道,不要别人一问SSO你们怎么做的,你问面试官什么叫SSO啊,那就彻底完了啊,它就是单点登录。
01:03
这个啊,咱说了这么一个词,然后下面给大家来介绍,单点登录,它到底该怎么进行实现啊,咱介绍它的实现方式。这里啊,我写一下。给大家讲这个位置啊。就是啊,在这里啊。单点登录呢,其实它的方式啊,有很多很多种,我这里边给大家来介绍它三种比较常见的方式。是我的描述啊,不是只有三种,只这三种很常见,所以各位就来介绍这三种常见的方式分别是什么?这个啊是我们做的介绍,然后下面咱就具体来说一下啊,首先我们先看第一种方式。这是第一种方式呢,在目前用的已经不是很多了,但是这种方式希望各位也给他知道啊,这种方式是什么呢?他用到了session这个对象的一种机制,叫这种机制叫做播机制,就是session的广播机制,实现在你登录这是第一种方式,我先列出来,然后给各位都详细解释。
02:17
除了这种之外,我们还有第二种方式。第二种方式是什么呢?咱需要用到两个技术实现一个技术,这个技术。叫做cookie,还有一个技术,这个叫RA来实现我们的单点登录,这是第二种方式啊,怎么做,一会咱介绍啊,然后除了他之外,给各位再来介绍第三种方式。第三种怎么做呢?我们使用一个东西叫这个。Token啊,做一个实现,这是三种方式,这个啊各位先知道,给各位介绍三种常见方式,然后三种方式分别是什么,咱们一个一个来说一下啊,第一种方式,我们刚才介绍到叫session的这个。
03:05
广播机制。那这是什么意思呢?大家看这词广播。我说各位是否知道啊,什么叫广播呢?大家可以想象一下,比如现在这里边我们有一个广场,广场上站了很多人,然后在前面一个人拿着一个喇叭,就是所有人喊,这个过程是不是叫广播呀?他一喊他一个人喊,只要拿着喇叭,那站到广场家人是不是都可以看到,或者说都可以听到,这个过程就是广播。而在我们程序中,他是怎么做到呢?大家看这词叫session广播。Session广播说的通俗点,它是什么意思,就是做到这个叫session的复制啊,就是一个复制过程,那什么叫复制,我说一下啊,比如现在还是这张图上,我在第一个叫SE丢中登录了,然后登录之后呢,把这个数据放到了session这个对象中,里边存了你的用户信息,然后做完之后他又用到session广播机制做什么事情呢?就是把session对象先。
04:13
复制到。这个oss模块中,然后复制之后再复制到我们的这个CMS模块中,就是在你里边的C模块中,把你登录里边的三这个对象复制到其他的模块中去,在每模块中都有你登录之后的session对象,做一个叫session复制,而复制之后里边肯定有数据啊,因为把session直接就复制过来了,这样的话我们这种登录就可以做到,当你第一个登录里边有数据,然后第二个再登录判断session中也有数据,第三个里面数据,因为它把session你登录之后,这对象复制到了你的其他模块中,这种方式就叫session广播机制,说的通俗点就是一个叫session复制过程。
05:00
啊,这个各位给他知道啊,然后这种方式呢,虽然可以做到,但是它有一个致命的缺点。我说各位是否能想到啊,它有什么缺点,看这词是不是叫session复制啊,也就说我现在啊,我这里边如果说我只有这么几个模块,我做过复制,应该没有什么问题,但是如果说我项目中啊,比如说我这项目中有几十个模块,假如说有20个这个模块,或者说有30个模块,那你注意我这个session是不是要复制几十次,而每次复制对于我的资源是不是都有一个极大的消耗,所以这个过程中啊,它并不适合咱们多模块,如果说你只有少数几个模块这么多可以做到。这种方式是一种比较早期的这种方式,因为大家知道啊,在早期,比如说20多年前,或者说30年前,那个时候网络刚兴起的时候,上网人不是很多,那个时候网络的访问量也不是很大,当时网所以比较慢,所以那个场景下咱用这么session这个复制机制就完全可以做到,因为它的服务很少,但是目前的用这种方式不合适,因为它里边你模块很多,每次复制会造成你的资源的极大浪费,另外这里边还有问题。
06:20
复制section,什么session,什么叫复制?什么内容都是一样的,会造成你的数据重复浪费,我的空间的占用啊,所以这种方式大家做个了解,是一种早期的方式叫session广播机制。这个各位都知道啊。这是我们说的第一种方式。啊,大家了解一下哈,Session广播,然后说完之后呢,咱再看第二种和第三种方式,就是第二种和第三种,在目前的实际的这种项目中是被广泛采用到的,就是要么用第二种,要么用第三种,或者说两种方式混合使用啊,这是用的很多的,然后咱们下面给大家具体介绍第二种第三种。
07:04
那咱们啊,先来看第二种方式。我这里强调啊,这个第二种和第三种的过程稍微麻烦一点,但是要求各位要给他记住,因为这个在面试中被经常问到。包括咱在项目开发中,这些方式也会经常写到。那咱们啊,先看第二种方式,我们是怎么做到的。给大家啊,我就写到。这个位置啊,第二种方式,那给各位画一下啊,它是怎么做的。然后咱们看第二种方式啊,这里边呢,用到了两种技术,一个叫cookie,还有一个叫什么red cookie,咱刚才各位啊也回顾到了,Cookie的特点是什么呢。它是不是一个客户端技术啊,我再写一下啊,给大家写到这个里边啊cookie。它是一个客户端技术,说的通俗点啊,它是存到我们的浏览器中,而你在浏览器中,我们就是每次发送请求。
08:10
它会怎么样,都会带着你的cookie这个值进行这么一个发送,这是一个特点,就是它是存到浏览器中,每次你发请求里边都会带着cookie值就给发送,这个叫cookie,这是第一个,第二个技术叫red,咱上的课回顾到了,Red是不是一个内存数据库,它的最大好处是不是就是读取速度快呀?而red还有一个特点。咱也上节课用到了啊red是不是基于这个叫KY6。做的一个存储啊,包括咱看这里边,比如说我们之前存这个数据,这里边是它的所有key,然后咱们根据它的key,比如写个get,假如说我叫test,根据K,然后里面这个值啊,没没有给它连进去啊连一下。
09:01
杠塞乱啊,然后来一个。得到它所有的K,这里边列出来,然后现在我来一个get,比如叫test,这就表示根据K得到里边的值,Ready是基于KY6做一个存储啊,所以咱们用到这两个技术,包括它的特点,把单点登录可以做个实现,那怎么实现给大家具体来写一下啊,它的过程。我在这个位置给各位来画一下啊。就是他每步怎么做到的。首先我们的第一步。比如现在啊,我第一步操作,我在这个就是就是集群或者分布式服务中的,比如说在我这个项目中的任何一个模块,现在进行了一个登录啊,就是做了一个登录操作,然后登录之后。啊,登录之后。我们要干什么事情呢?给大家说一下啊,这里边我们要把登录之后的数据给它放到两个地方去啊。
10:02
注意是放到两个地方去。登录之后我们要把数据。放到。两个地方,哪两个地方一个是一个是cookie。啊,一个是。一个是cookie,那怎么放给大家写一下啊,首先我们看RA,因为咱说到red呢,是基于key value进存储的,所以说我们现在在re key里边咱要放个值,然后在它那个value中要放个值。啊,这是我们的两个地方啊,在K里边放值,Y轴中放值,然后咱要放什么写这位置啊,首先咱看在Y轴里边放的肯定是我们那个,就是用户的那个数据,这个放的Y6中k value6结构嘛,放里边,然后K里边放什么呢?咱放的是一个,就是我们按照一定规则生成一个那个唯一的或者随机的一个值。
11:01
把这值放到咱的K里边去啊,这是在value中放到两部分,K里边放一个唯一的一个值,Value中放你的用户数据。这个啊一部分。这个不是各位是否能看懂啊,我再说一遍,比如现在我在这个项目中的任何一个模块,假如说我们在瑞一丢模块,咱登录了,登录之后呢,咱把数据放两个地方,第一个叫red red因为它是KY6,所以咱在它的K里边生成一个唯一的一个值,Y6中放它的用户数据。然后这个唯一值呢,生成这个规则不一定啊,看你的实际要求,一般来讲啊,很多人喜欢用这种规则,比如说根据你的这个纸。IP地址,或者说根据里边那个就是啊用户那个ID,或者说根据什么UID等等啊,根据这些生成你的这个规则,这个规则没有一定的啊,看你的实际,比如说你根据ID,因为IP是唯一的嘛,根据UID,包括再加个UID把这值生成啊,这是里边的。
12:11
第一部分把这个放到我们的ready中,然后放完ready之后,咱还有第二部分还有一个cookie cookie里面放什么呢?就是把你那个red里边生成的key的值放到咱的cookie里面去。这是他的第一部分啊,这个我们提到的啊,所以大家把这个第一步知道我再说一遍啊,咱们先登录,登录之后呢,把你的第一部分数据就是用户数据,包括生成一个key,先放到ready中,然后把red中的key再放到咱的cookie中,因为red么key value存储cookie里边会存到我们的浏览器中,这是第一步啊。然后咱们看第二步。第二步怎么做呢?往下给大家继续来写啊,比如说我们现在我再去访问我项目中的其他的这个模块,比如说我第一个带ebo,第二个比如说我带那个oss,那这个怎么做呢?
13:17
刚才说到了,因为咱们啊,发送请求的时候,它会带着这个cookie值进行发送。啊,做这么一个发送,这过程由浏览器帮咱们做到了,你每次请求都会带着库一制进行发送,那咱怎么做呢?就是咱们在过程中,咱们要获取到我们的这个cookie值,然后拿着这个cookie值咱做个事情。啊,就是做件事情。做什么事情呢?希望各位能想到啊,你注意咱们cookie值是不是就是ready中的K,那咱的做法就是把这个cookie里边。
14:00
获取到那个值,到这个ready里边进行这么一个查询,你ready key就是cookie值,根据那个ready key进行查询,如果说你能弹出数据,那表示它就是一个登录。如果说你查不出数据,那现在它就不是登录啊,所以主要是这么一过程,用这个过程再来实验出这么一种单点登录的一个基本操作啊,这是一个最基本流程一个介绍,咱们现在这么来做的啊。我把这个给大家画一下,然后我再重一遍啊,要各位把这个给它记住。它是怎么做到的呢?比如我现在在switchs edu这个模块登录了,登录之后怎么做?咱把登录之后的数据放到两个地方,在ready中放KK是按照规则生成的一个唯一值,比如说我们根据IP跟据用户ID value中放你的用户数据,比如说用户名字什么用户的其他信息,然后放完之后把这个K。
15:07
再放到我们的cookie中啊,这是第一部分,然后第二步,假如现在我再去访问我们的oss,那这时候怎么做到呢?因为你每次访问都会带着cookie进发送,这是浏览器中一个特点,每次访问有IE,它都会带着发送,那咱怎么做到呢?在OS中咱就获取到cookie值,然后拿着cookie值来做件事情。做的适应就是拿cookie值到read中,根据key做个查询,如果说这cookie值它的K能查到数据,比如说我们刚才里边的这个写法,根据test这个key,如果能查到数据,那表示它就是一个登录,如果说你查不到数据,那现在它就不是登录。主要这么一个过程啊,当然咱做的更严谨一点,你查到数据可以到数据库中再做个验证,看数据对不对,如果都正确,它就是登录,如果不正确它就不是登录,所以这是我们的第二种方式,用cookie加ready的实现,用这个过程做到这个单点登录。
16:12
这个啊,我们做了一个说明。大家把这过程给它好好去记一记,好去看一看,这一在面试中会经常问到啊,这是我们说的第二种方式,Red加cookie做个实现。这个我们就说了啊,然后说完这个之后呢,咱们下面还有第三种方式,其实第三种方式呢,跟第二种差不多,就是他们有一点点区别啊,那最后给大家介绍第二种方式,包括在我课件中画的,跟我刚才说的基本上一样啊,就那种方式,我就在这里边直接咱用文字做个描述。然后最后啊,我们看第三种方式,这种方式。就是用这个token做个实现。那我们说一下这个是什么意思啊,咱看第三种方式。
17:00
给大家啊,画到这个位置。那咱家看啊,这个该怎么去做。其实这个第三种方式中呢,咱们也能用到这个cookie啊,那我就不用cookie了,咱直接用to做个实现,那咱说一下什么意思啊,首先我们看第一个术语叫token。先给大家说一下这个token到底是个什么东西。就token是什么?小这个位置啊。给各位说一下啊a token呢说的比较官方,说的通俗点,什么叫token,它就是按照。一定的规则生成的一个字符串,这规则你可以自己约定,比如说什么样的规则,然后这个生成字符串里边啊,字符串里边你可以包含你的。用户。信息这个叫to,就是一个字符串,比如假如说我这字符串啊,我是根据这个,比如说我就举个例子啊,假如字符串,我是这么一个字符串里边,比如说有这个。
18:10
IP地址。1.1,然后加个井号,后面加上我的用户名,比如user name,咱是这个Lucy,然后再加上我的用户信息,比如用户信息,它是一个这个呃。是一个什么?高级讲师啊,结果随便来个,比如是一个二,然后再加一个。井号,假如后面有它那个什么头像等等一些信息,这是我们一个规则,然后咱们选规则之后,比如最后把这规则我们再做一个BASE64编码,然后编码之后,假如说我再给他做个加密,最终咱看到就是一长串一个字符串,因为字符串我又做了编码,又做了加密,别人肯定不知道我是怎么编译的,怎么加密的啊,这是一种规则。咱照这个规则就可以生成这个字符串,然后你看字符串中包含咱的用户信息,就是Lucy,包括它二代表什么高级讲师,这个啊就是叫ton,就是一个字符串,里边可以包含信息,只是字符串咱需要自己来制定一定的规则,规则具体怎么样,这个不一定,看你该怎么制定,比如刚才我这规则啊,就算是一种规则。
19:18
这个啊,就叫ton。我给咱们删掉啊,再写出来啊,按照一定规则生成的一个字符串,然后字符串中可以包含咱们的用户信息,这个就叫ton啊,那咱们用它来做到一个叫单点登录,咱们看怎么来做到给大家啊,还是在里边我来写一下啊,第三种方式怎么做到。我写到这个位置啊。它的做法就是呢,首先比如说我们在项目中的某个模块,我们现在进行了登录啊,就咱们已经登录,比如我在edu中已经登录了,然后现在登录之后呢,他要干什么呢?就是按照我们这个规则。
20:05
生成一个字符串,然后把咱们登录之后的用户信息给的就是包含到你生成的字符串里面去,这是它的第一部分,假如我们生成字符串里边有用户名称,用户什么资历,包括有IP地址,然后咱把这字符串给它做了一个BASE64编码,然后又做了一个加密,这样的话就生成了一个字符串。然后升字符串之后怎么做呢?最后咱把这个字符串给它做个返回,返回怎么做呢?就是你可以放到cookie中,也可以不放到cookie中。啊,写到这个位置啊,就是返回两种方式,咱可以把这个字符串。通过这个cookie返回,就是这么做是可以就这位置啊,另外你也不用cookie返回,怎么返回呢?就是我把这个。
21:02
字符串通过咱的地址栏做个返回,两种方式都可以做到啊,这是我们的第一步,然后说的更细节点啊,比如现在我在这里边啊做了登录,然后登录之后呢,它会有字符串,第一种方式咱通过cookie存储,第一种方式,第二种方式我不通过cookie怎么做到呢?我在地址栏中存储,假如说我现在我加个问号。Token等于就是咱们按照一定规则生成这个字符串,用这种方式做个返回,这也是一种做法,你看这里边token中等于值值,这个值咱按照一定规则做了编码,做了加密,那别人看到他也不知道这是什么意思。这个啊是一种方式。所以大家知道啊,包括你看啊,咱就看一个实际例子,你看在这个阿林中它后面。是不是这些东西啊,那这些是什么,是不是咱肯定不知道,是它按照一定规则给我们返回值,所以咱们现在也可以这么做啊,包括你看这里边,这些里边都有一些值,但是值是什么规则,这咱肯定不知道,这是它的规则生成的一个字符串。
22:09
所以这是第一步,登录之后通过地址栏反映数据。第一步咱们可以这么来做的啊,然后咱们再看第二步。第二步怎么做呢?比如我现在啊,我再去访问我项目中的其他的模块,那怎么做呢?咱每次访问带我的地址栏都带着你那个就是生成的字符串啊,都带着字符串,然后带着之后,比如我们现在访问在你访问的模块里边。咱可以获取到地址栏里边的字符串,然后根据字符串。获取里边的用户信息,也就是说呢,比如现在你看啊,我每次发送后面都带这个值,然后这个值呢,在在模块中,在外值取到,取到之后呢,从这个值里边把用户信息取出来,因为这个值呢,是我做的一个规则,什么规则我们肯定自己知道,所以咱可以把它,比如做一个解码,然后从里边把数据取出来,这个啊是它的第二步,就是从。
23:15
访问模块中获取地址栏中的字符串,根据字符串获取用户信息,如果说可以获取到,那它就是一个登录,如果说你获取不到,那它就不是登录啊,这是我们的第二部分,所以咱现在根据token方式,我们就是这么来做到,按照一定规则生成和字符串,然后字符串中的可以包含用户信息,每次请求都带着字符串发送,就类似于这种情况下,每个都带着,然后带着之后咱们把这取到,如果能从里边取出用户名称,那就是我们的登录,如果取不出来,那就不是登录。这个啊,是咱说的里边的第三种方式,通过token做个实现。
24:00
这各位你就知道啊,比如咱们把三种常见的单点登录介绍完了,最后重复一遍啊,第一个session广播就是session复制,但是这种方式如果你模块很多,会造成复制,浪费了大量资源啊,包括占用了大量的空间,所以这种方式目前已经基本上不用了,当然各位知道是一种方式。第二种方式,Ready加cookie red中存你的这个key和Y6值,然后把ready key再存到cookie中,每次请求带着cookie去查reds能查出数据就是登录,查不出来就不是登录。第三种方式,用token,就是token是一个按照规则生成的字符串,字符串里边呢有咱的用户信息,而每次请求都带着字符串,就类似于。这种形式都带着这个东西,然后咱们每次从里边获取取值,如果能取到用户信息就是登录,取不到就不是登录啊,这是它的三种方式能做到,咱说这个单点登录。
25:06
所以各位啊,把三种方式给他好好去看一看,好去记一记,在实际的项目中可能都要用到,包括在面试中,这基本上经常被问到,也属于项目中一个标配的这么一个东西。这个各位给他知道啊,然后里边还有一个细节。这细节这里边不知道各位是否记得啊,咱之前学过session session是不是有一个默认的过期时间有。那希望各位给我一个回答。应该是外部进去啊,你说session的默认过期时间是多长,比如说session它在多长时间之后就失效了,比如咱们现在这项目一直不操作,那过了多长时间session值就没有了,三就会失效。其他同学希望你能想到啊,还有同学给我回复了,默认是不是30分钟咱可以改啊,只是一般没必要改,就默认你30分钟不做任何操作,Session是不是就过期了,而现在同样,咱看我这里边啊,我们这第二步第三步也能做到session,就是这个过期时间啊,它不用session,第一步是session,第二步第三步没有session,它也能做到过期,那怎么做到呢?给大家说一下啊,首先大家看第一个。
26:22
各位都知道red是不是有个过期时间呀,咱可以通过设置red过期时间做到跟session一样效果,假如我设置red过期30分钟就可以做到,然后第三个token token咱在生成的时候也能设置它的过期时间,怎么设置,一会咱会说到啊,就是这两个也能让他们你多长时间不操作就失效了,Red通过他的过期时间设置token也能做设置。这个啊,各位给他要知道啊。所以咱们现在啊,把这个原理性的东西我们就说完了,就是关于单点登录该怎么做到啊,所以各位知道原始方式用session,当然这只适合我们的单一服务器,如果说你做集群或者分布式也要做到单点登录,在一个模块登录其他模块不需要二次登录,可以直接访问,比如咱的百度,你在百度贴吧登录百度文库,百度知道都可以直接进行操作。
27:21
而单点登录怎么做到三种方式?这三种方式各位都记住啊。咱刚才都说到了,分别都是怎么做的啊?这个图我先保存一下啊。呃,这应该是我们的,呃,第二张图啊。单点登录。三种方式的一个介绍啊,这是三种最创见方式,这个我们就说完了啊。
我来说两句