00:02
各位大家好,我们继续来学习security,刚才呢,咱通过源码分别查看了spring c里边的认证流程,还有它权限仿的过程,那咱下面继续来看,下面咱们学什么呢?给各位来说一下,就是一般来讲我们认证之后,用户信息大部分是不是通过session进行多个请之间的共享,就是session里边认证之后存信息,下次访问如果30里边有信息,那我们就认证成功,进入我们的操作,而我们在认C里边是如何实验这个过程的,因为咱刚才说到了我们认证之后呢,是把你这证信息放到这个对象中去,就这个author里边,那我们下面就通过源码来详细说一下这个author,这个用户认证信息是如何与筛进行绑定的,把这过程给各位做一个详细分析,咱也是通过源码做个查看,那他怎么做到的,咱先。
01:02
看一下里边有张图,然后咱们看源码,这张图上其实咱们刚才看过左边部分就是我们这个认证过程,通过过滤器,通过它的委托关联访问user detail,然后这里边用这个author进行认证数据的封装,各位看啊,在你封装之后怎么做呢?它会把这方数据给它怎么样存入到这个security contact,然后放到这个security context holder里面去,再通过一个过滤器叫security contact persist filter进行我们最终叫反应过程,所以它用到了这么一个对象。包括security contact security content holder,还有这个filter的过滤器,那我们下面就把这三个部分的源码咱们详细看一下,看一下它的底层到底是怎么做到的,那各位跟着我,咱们一起来看一下。我这里写一下啊,咱现在讲的就是我们请求间如何实现这个认证信息的一个共享,比如说我们这个all CIRC对象跟session如何是进行绑定的,咱看这过程,那咱们怎么看呢?首先呢,我们先看里边的第一部分。
02:18
就是咱们之前啊,有一个认证成功的方法。不知道各位同学是否记得啊,当时咱们在认证成功方法中有行代码,这行代码就是啊,把我们那个认证的信息那个对象放到那个叫security contact里面去,它有这么一个东西,那我们来看一下哈。就是关于我们这个方法,那我们找到我们认证成功方法应该在这个,就是我们那个u PAR filter这个类中。是不是这个方法,各位看啊,这个方法是那种成功,里边有一行代码,这行代码它就把咱们认证的这个信息author CI里面的一个对象,咱们做了封装嘛,就是它给它放到我们这个contact里面去,并且给它存入到这个security contact盒里面去,就是用它进行封装,然后给它存进去,所以里边做了这件事情。
03:15
给各位。截一下啊,它里边做了。这个代码。我在里边写一下。就是在这个方法中,我们做的事情就是。把我们认证信息那个对象,就是那个对象给他先封装到这个叫security。Contest这个里边去,然后并且在存入到这个叫con,这个就是holder里边去。我写一下啊,Ho DR里边,所以在这个方法中,它做的是这件事情,咱通过源码这里边也可以清楚看到它里面的过程。
04:03
然后这个过程中我们看到啊,因为现在呢,它首先把对象先放到这个security count中去,然后在存入到里边去,那我们下面先看一下这个security contact对象,看这里边它里边是什么样一个结构。我们看一下啊,这个叫。Contact的对象。我们做一个查看。那咱们看一下啊,这个对象。我到里边我就直接搜索一下啊,或者这么直接找吧,就这个对象。然后各位看啊,这个security contact是个什么。是不是它是一个接口,然后包括咱再看啊,它的里边有一个方法是不是就叫all CIRC呀,其是它本质上就是对这个all CIRC进行封装,它一个实线内,你看里边是不是做了这个封装,包括你看这个位置。他是把这值给做一个设置进去啊,它就是对。
05:00
做的封装,这个叫security contact的接口,还有它的实现类,我在里边写一下啊。这个对象的作用就是对于我们那个OCI。进行了封装啊,这是里边的第二个对象,这各位也得知道啊,然后这个看完之后再来看另一个对象,就是context holder,看这里边他是做了什么事情,就是它里边是怎么做到的。那我们到里边咱们给它搜索一下啊,这个对象。我到里边。搜下。就是这个。然后各位看啊,这个对象中呢,就是它做了就是很多的事情,它主要用到一个东西叫这个thread local,不知各位是否知道这个东西啊,Thread local什么意思呢?把操作和当前线程进行绑定,它主要用到这个处理,首先你看啊,它默认是这个model,就local这种模式,然后里边通过local进行这个操作,用local对于我们的security context进行这么一个存储,包括你看这里边啊,它就对这些进行我们相应的处理,包括做各种判断,然后里边对security context做这么一个处理啊,主要就是做这个事情。
06:28
这各位知道啊,就是它底层用到了thread local这个对象。我在这里边给各位爷写一下啊,就是里边的D。三个。这个叫hold。它是使用这个叫threat。Local。进行我们这么一个。操作啊,就是和当前线程做了这么一个绑定啊,咱通过源码也做了一个查看它是这种模式,然后判断对我们那个security context进行这么一个处理,然后这个过程中呢,咱们再找一个方法,这个方法是不是叫get contact,因为咱们取数据要用get进行处理嘛,所以get里边呢,其实它做了一个操作,什么操作呢?就这里边,如果说当前线程中啊,有这对象,那把它就进行返回,如果他没有对象,他会创建一个新的一个就是空的一个count对象,别把对象给他,就是放到我们那个机构中去,然后为了我们后面进行使用。
07:32
所以它里边做这个处理,也就是说里边有的话返回,没有的话变一个新的这个对象,这个叫get contextt,所以咱们通过查看把这个也做了一个说明啊,这是关于里边的这么一部分啊,也就是刚咱们刚才这张图上提到的,我们现在把你认证信息分对象author CI先封装到security contact中去,把security contact再存入到这个holder里面去,它这个holder里边用到这个叫在local和当前线程做了一个绑定,它里面是这么一个过程。
08:08
然后过程中最后呢,还要经过一个过滤器,那咱们最后把这过滤器我们做个查看。那我们找一下啊,应该就是这个啊,或者你直接搜索一下,所以最后经过这个过滤器,而这些过滤器什么意思呢?给各位强调啊,这个过滤器呢,它是我们里边的,就是我们说那些过滤器中的一个,而这过滤器的位置应该在所有过滤器的最前面,请求会先到这里,然后这里边做我们的处理,这里边主要做的事情就是把你的认证信息对象author和session进行绑定,那它是什么过程呢?给各位重复一遍啊,然后咱们也是看一下源码,其实过程并不复杂,首先我们认证成功会通过,这个过滤器在里边呢,会从那个叫security content holder里边把你封装之后,那个对象给它取出来,就那个content里面包含那个,然后把它放到筛里面去,当你再发送请求,怎么做也是经过这过滤器。它的做法就是。
09:12
判断当前三角中有没有这个对象,如果有的话,那直接放到后到里面去,如果没有的话,那里们给它取出来放进去,再做我们这个操作啊,所以它里边主要就是这么一个过程,就是它里边判断三中有没有这个对象,有的话直接给它取出来,没有的话取出来再放到这里边去,最终做我们的处理。就类似于我们那个ready似这个数据库嘛,就是里边有数据返回,没有数据取出来操作,再放进去,下次再取,Ready中直接取啊都是类似这个过程,那咱们通过源码来看一下啊。源码里边找到do filter,在do filter里边呢,他做了很多事情,咱就看它的主要代码部分,首先我们看第一部分这个代码。
10:01
大家看到啊,这个代码很清晰。做什么事情,是不是他就newing对象,就是第一个过程做的是什么,他就是当我请求来的时候,检查当前session中有没有这个security count泰对象,如果有的话,从session中直接取出来给它返回,没有的话建这么一个新的一个security count泰对象,就是做这个处理,看里边有没有,有的话返回,没有的话建个新的,然后这个做完之后往下看,就这个代码。这个代码什么意思呢?将上述得到这个contact对象放到这个后里面去,就这里边要么取出来,要么建个新的做这个处理,然后这个处理之后,他再进入到下一个过滤器,执行后面操作。啊,它主要是这一步骤,然后这一步做完之后,到了这一步操作这一步咱们才提到是不是叫get context,就是我们响应的时候呢,从这个hold里边把你的security contact给它取出来,然后这行代码就是移除里边那个security对象,最终将取出来这个对象放到我们的session里边去,所以它里边经过的就是这个过程。
11:18
给各位啊,我再重一遍啊。它的过程就是首先看筛中啊,有没有这个security抗对象,有的话返回,没有的话建个新的。而这个取出来之后,不甘你是取出来的还是建的新的,把它放到这个后到里边去,然后直行我们的加过滤器,直行之后进行返回,返回的话从里边把这个security contact取出来,然后移除之前的,再把它的数据放到session里面去,所以它里边按照这个过程把我们的。Author CIRC和session完成了这么一个绑定,里边就是这个过程,所以这个各位都知道啊,然后咱们现在数据呢,是放到security contact holder里边,如果你要取的话,怎么取,之前咱们也写过,当然各位看一下啊,当时咱们有一段代码。
12:10
这代码应该很简单,我们找到啊,就在这里边。我们看取的方式啊,从这个security contact的hold里边得到get contact对象,然后用这个auto是不是能给它取到报,你报里边名字啊,然后你可以取到里边的具体信息,所以这是他取的这个方法。所以这样的话,咱就把这个过程给各位做了一个详细的一个说明。就是关于这个如何实现多请求之间进行认证,进行共享,或者说我们这个OCI如何和session进行这么一个绑定,咱通过这个过滤器里边的过程给各位做这个,先说明各位可以通过刚才的讲解,把这个源码部分给他去看一看,因为里边每一部分应该都写的很详细啊,有这个详细的过程。
13:03
所以这个我们就说完了。
我来说两句