00:01
各位大家好,欢迎继续收看上硅谷视频课程,我们继续来学习three security,之前内容中呢,我们完成了three security它知识点的讲解,还有相关案例的实现,那咱们下面开始带着各位一起来学习任C可最中的原理部分,咱会通过查看源码详细来讲解任水最中的原理。那这里边我们下面就来具体看一下,之前咱们讲到了人水security体本质上是个什么,就是一个过滤器,电里边有十几个过滤器,然后咱们之前通过插源码看过三个过滤器,就这三个name password,包括exception,包括filter,包括对它做了解释,而过滤器咱也说合它的加载的一个过程,这是咱们之前提到的,那下面的各一个位就重点讲解一下这个spring security它的认证和授权的流程到底是怎么实现的,每步是怎么样一个过程,咱们通过源码做一个详细的一个查看。
01:13
那这里边我带着各位详细来看一下。首先第一个我们前讲解它的一个认证的一个流程,看这个过程是怎么做到的,那咱们怎么看呢?我们之前提到了,在three security里边呢,有很多过滤器,其中有一个过滤器就是这个过滤器叫username password author filter,它的认证流程是在这个过滤器中进行处理的,那咱通过它就来做一个具体说明。我把这个给各位我先截过来,然后通过它咱们做一个源码的一个详细的查看。那我们来看一下啊。就是我们这个。我把它给各位先截过来。
02:05
Username password author filter。给各位写到我的课件中。就这个。我们刚才提到它的认证是在这个过滤器中进行处理的,那他怎么做到的呢?我这里边这张图是一个总体一个流程图,把这个图我们先做一个总体说明,然后咱们通过源码做个查看。那各位看到啊,当我们这里边呢,咱们进行登录的请求,它首先会先到这个username password author filter legal过滤器,而我们第一次进行请求授份题认证,所以它里边第一次肯定未认证,未认证它也通过这个对象叫author manager,然后委托这个叫auto provider去关联我们的user detail service去查数据户,判断你这个用户是否是数据库中存的用户,也就是进行认证过程。
03:04
当认证通过之后,他把插入数据封装到这个user detail套中去,然后进行这个author进行封装,把你就是认证之后信息在这里边做一个封装,所以它里边有这么一个总体的流程,通过这个流程完成一个认证,那它的具体的做法咱通过源码我们来看一下。咱们就一步一步来说一下啊,首先第一个呢,我们先搜索里边的,就是咱们刚才说那个过滤器的对象。这些我先关掉,咱重新搜索一下啊,Ctrl shift n,然后里边有搜索,就是第一个过滤器,Username password。这个aleration,呃,不是这个aleration filter啊,这个类咱们一会也可以看到啊,我们先看到那个过滤器的部分。我这里写一下啊,Username。Password。Author filter,注意这是一个过滤器,然后这个过滤器我强调啊,就是当我们前端发送一个请求。
04:10
这里强调它需要是一个POS请求,它都会被这过滤器给它拦截掉,并进行身份的认证,而过滤器里边呢,有一个方法,就是咱们之间一直属于那个do filter方法里面进行那个过滤的过程,而do filter里边呢,这个位置中它会做一些相快调用,其实它的主要调用中啊,会调到它的这个,你看啊是不是一个继承关系,它会调里边这个负类中结方法做操作,那我们现在呢,首先我们先找到里面这个负类,然后咱们往下详细做一个说明。包括啊,我们看一下就是它这个负类,那现在我把这个负类给它打开,就这个注意这是我们说的过滤器那个负类。给各位截个图。我在笔记中给各位一步一步详细在里边都标注出来了,那咱看啊,就是里边首先的。
05:09
第一部分。我们先来查看一下过滤器的那个。负类,它的负类就是咱们刚才看到的这个负类,在这个负类中呢,我们找到它对应的方法,注意啊,我现在是带着各位同学,咱们一步步研究它的源码是怎么做到,就是咱们扒它的源码,然后在过滤器中呢,我们首先找到它的方法,这个叫do feel的方法,因为过滤嘛,肯定只用这个方法,在这个方法中,咱们看它是怎么做到的啊,首先我们看里边的就是第一部分,你看啊,里边有这个部分。而这一部分做什么呢?就这里边啊,它是做了一个判断,因为咱们提到我们做认证是不是需要是一个POS提交,比如说第一步当你是POS提交,那我进行我这个下一个操作,如果说你不是这个POS提交,那我这里边就直接放行,所以只有你是POS提交,我来做个认证,所以这是里边的第一部分做这个就是你的提交方式的一个判断。
06:12
这过程给各位截一下啊。我截到这个位置,包这个do feel的方法,然后放到我的笔中来。给各位小这个位置啊,就是这过程它的做法,刚才我提到的。在我们这个过滤的方法里边。它里边做过判断,判断你的提交方式是否是一个POS提交,如果是POS提交,那我们进行认证,如果你不是po提交,那他就直接经放行,所以他首先做的是这种啊,就是我们说的。第一步会做这个事情,然后这个做完之后,下面的它会继续往下来做,那当往下继续看源码,看看这个位置啊,这边有个对象叫这个author,这对象刚才提到它就用于封装你那个认证信息的那个类或者一个对象,所以它下面做这个操作,大家看啊,这个操作干什么呢?其实它是调我们子类,也就这个username password field中这个type的方法得到表单的数据,然后进行身份认证,然后认证之后呢,它会返回这么一个对象,就这个。
07:27
叫author result,把这个对象封装到我们那个对象中去,就是里边会做了这么一个处理,这就是它里边的第二步操作。那各位我来写一下啊,说的简单一点,就是你在POS提交表单之后,得到表单提交过来数据,然后这里边我们进行查数据库,包括做这个认证,认证之后把你认证通过信息用这个all CI进行封装,它就是做这么一个处理。这是我们说的第二步操作。
08:01
这个啊给各位。接过来就在这里,我在上面也特别标注一下。这是他的第二步。我们做的事情就是。它会调用子类。里边的方法进行你这个身份的认证啊,也就是查数据库,看看用户密码对不对,如果说你认证成功之后,把我们的认证的信息封装到这个对象里面去,就这个author kit对象中去,这就是里边的第二步操作,它就是来做这个事情,我把这两步给各位在这个图上都画出来了,我再重复一遍啊,就是我们发送一个请求,它里边首先第一部分先判断你是不是一个POS提交,如果是POS提交往下去进行,不是POS提交直接放过去,不仅我们这个操作,我们现在是否提交,所以第二步就是调用子类中这个方法进行身份认证,也就是查数据库那过程看用密码对不对,如果认证之后,那把认证信息就放到这个OB的对象中去,所以这是里边的第二步,咱通过源码做查。
09:17
查看,然后咱们继续往下看啊,往下看大家看这个代码,这个代码中啊,有一个很标志性的一个单词。是不是一个session,所以他做的事情是什么呢?是配置你session的一个策略,比如我现在有很多用户,那我可以配置你多个用户那个session的最大并发数啊,如果你没有配置,那里边不执行,如果你配置的话,里边主要是做这个事情,就配置session的一个策略处理,这算是里边的第三步操作。给各位截个图,这是咱们的第三步,就是第二步认证成功之后,第三步用session来存储那个机会内容。这个啊,给各位来到这里,然后我在上边也是标注一下。
10:02
第三步它的做法就是做你那个session的一个策略的处理,比如说我配置了session最大变号数,然后里边做一些相应的处理,所以这步我们就做了一个说明,然后这步做完之后,咱继续往下做啊,按照咱说到的第一步得到表单的数据是破测提交,然后得到之后去查数据库做认证,认证成功做封装,那咱们看啊,这里边写了一个try catch,咱还catchche里边的这个地方。各位看啊。不知各位是否能看懂这个单词?Cessful是不是成功了,Unsucuccessful是不是失败呀,也就是说啊,你认证成功之后,他做这个风包,如果你认证失败,它会在异常里边做个处理,就会掉这个方法,这个方法就表示你认证失败之后,它会掉这个方法,然后做你认证失败处理,比如说提示用户说你没有权限登录操作,所以这个算是他的这个第四步啊,当然第四步中还有一个成功,咱们线下这个失败。
11:08
谢谢各位。截一下啊,这表示。认证失败,我在这图上给各位也是画一下第三步,我们这个策略,然后第四步。到这里。第四步我们算是第四步的第一个分支,当你认证失败,它会抛出一个异常,然后咱们执行认证失败的那个方法,就咱看那个UN successful author CI这个方法做你认证失败处理,所以它的失败处理呢,并不是做直接处理,而是通过抛出异常,然后由那个异常处理器做操作,异常处理器之前咱也提到了,也是咱们见到的。这个东西叫exception transaionation filter用它来做的,所以这是它的第四步中的第一个分支,然后这个说完之后,我们继续往下来看啊,大家看啊,认证有失败是不是就成功了,这也就是这位置,当你认证成功之后呢,它里边会做件事情,就是指引我这个认证成功处理器,或者说调用我这个认证成功的方法,而这里边是做了一个判断,因为就是这个只呢默认为false,当我们认证成功之后,它这值就变成了处处之后,然后咱们执行里边的这个操作。
12:28
啊,所以这里边就是认证成功的这么一个处理。我把这个给各位也是接过来。也就是我们对应的第四步的第二个分支。我写一下啊,第四步第二个分支,当你认证成功,然后它会去调用认证成功的这个方法,比如咱看这个叫successful这个方法,然后做你相应的一个处理。所以这是我们的第四步,也就说到这里,咱把这个过滤器中一个最基本的流程我们就会说明啊,当然里边还有细节,咱一会儿具体来看这流程我们再重复一遍啊。
13:11
告诉各位怎么做到的,就是现在我发送请求,它会到我这个username password author这个filter里边,然后在这里边怎么做,先判断你的po提交,再判断之后它会掉我的这个负类中的方法,负类方法怎么做,如果你是破提交做认证,不是的话这些放行,如果是的话怎么做,他就会调它子中这个探方法去查数据库,然后返回那个user details。之前咱们提到过,把你认证成功的数据封装到这个auto CI kitchen对象中去,并且做这个session策略的一个设置,当你认证失败,这里边用异常抛出调认证失败方法,认证成功把这值变成处,然后调你成功的方法做你下面的处理。所以这是一个我们说的最基本的流程,也就是在这个。
14:03
Username password author filterd负类中它的一个基本的过程,所以各位把这个给他知道,咱们也是通过源码做了一个查看啊,这是我们说的第一部分,然后这个说完之后,咱下面继续往下来看啊,就是咱们进一步往深入再给它挖一下。怎么深入挖呢,刚才我提到你看啊,在我这里边。大家看里边的,就是咱写那个应该是我们刚才说的第三步。啊,第三步。呃,注意我这里应该是第二步啊,第二步这个方法,在这个方法中各位看到啊,这里边呢,当我就是。是POS提交,它是不是要调子中这个方法做认证了,那我们就看一下子中这个方法叫attempt这个方法,它里边底层是怎么做到的,咱也通过源码做一个查看,那我们来写一下啊,比如说我们下面的。
15:02
第二部分。就是上面的第二步里边,它会调用此类中的方法进行,你这个就是认证的过程,那咱就来查看一下这个源码,看这个调用子类方法做这个认证的过程怎么样,也就这个额肽的方法里边到底是怎么做到的,那咱们进一步看源码。那我们看怎么看啊,首先这个是父类,它的子类是不是就是这个username password or the filter,所以我们现在来看。这个就是它的子类,我把这个给各位截过来。然后在这个子类中呢,有一个方法,就咱说那个叫type的方法,这个方法。我把这个给各位也是提过来,然后咱们看这个方法中,它到底是做了什么事情。这里标注一下啊。
16:00
第一个是他那个。子类,然后第二个是里面那个方法,那咱看这方法中是怎么做到的,咱们详细来说明一下啊。首先咱们打开第一部分啊,你看啊,上面定了一些相关的一些固定值,比如说这里边有username password,包括这里边默认只能用这个POS提交啊,就是里边这些固定值,就是你表单中跟他一样,然后这个定义之后,下面在这个方法中我们清楚看到啊,在这个方法中咱先看这个啊。这什么意思,Super是不是就是变成负类啊,就是它里边啊,要求你默认表单提的方式,还有你这个路径就是默认是用这个杠捞印,当然咱可以自己改,包括它默认是一个破提交,主要是在这个方中,这个方法中呢,就是。调用这个额态的方法进行身份认证的过程,那我们看这个方法中它到底是怎么做到的,就是里边每一步怎么执行的,首先我们看啊,第一步就是第一个if判断。
17:08
这个应该很好理解,是判断它是否是POS提交,如果不是POS提交,那它就会怎么样。是抛异常啊,所以这是里边的方法中的第一步,给各位啊,我详细来。一步来说一下啊。就是方法里边的。Evil。就咱们看到。这个代码,它这个代码这第一步很简单,就是判断是否是POS提交,如果是的话往下执行,不是的话抛出异常,这是第一步。也就说下面咱再往下看啊,看下面就是往后是怎么执行的。咱们往后来看。第一个POS提交,如果不是的话,跑出异常,如果是的话,这是干什么?是不是得到表单提交过来的数据,就是你提交过来的用户名和密码,这个算是我们的第二步操作啊,包括他做了一些判断,比如等于,那默认值就是这个空字母串。
18:12
这个拿过来啊,咱们说的。第二步。就是方法的。第二步,获取表单,POS提交过来那个数据,就是提交过来的用户名和密码。这个啊,我们应该很清楚能看到,包括这个过程,咱之前也做过一个。基本说明啊,这是第二步,然后这个做到之后,咱往下看,大家再看这个位置,咱看啊,这个位置是什么意思呢?我们看到啊,首先这里边呢,是new了一个对象,叫username password author CI,就是是不是这个token,然后new这个对象,而这个对象它是干什么的呢?我强调啊,首先就是我们这行代码,意思就是我现在呢,得到是表单挑过来的数据,然后把这数据呢,要给它构造成这个叫username passwor auto kitchenit token这个对象,给它标记成目前是一个未认证状态,因为你还没有查数据库,它肯定是未认证状态,然后这个做到之后,咱们将请求信息给他设置到这个对象中去,就往里边设置相关一些信息,比如你这个数据啊等等,然后设置之后,最后我们再调用这个叫RR类中的这个方法,就是最终调这个方法做这个身份认证。而这过程。
19:35
程中,后面他就会调用我们写那个user detail套中的方法进行我们降子操作,所以这里边后面几步主要是做这个事情。那给各位截一下,把我刚才说的话在笔中给各位来快速写下啊。算是我们的方法中的第三步。就是这里啊,我写一下。
20:00
方法中等。第三步它的做法就是我们使用,就是我们获取到那个数据,获取到啊,咱们传入的数据,把解球用户密码给他,就是构造成我们这个对象,就是咱看这个用户name pass author token这个对象,然后构建之后,并且给他就是标记成是一个未认证的一个状态,因为目前肯定是未认证。然后这个做完之后,下面咱们要具体怎么做呢?我们就可以将请求中的一些信息啊,或者说把请求中的一些属性的信息给它,在设置到这个对象里面去,比如说你的session值,比如说你require里面有S包你等等信息设进去。然后设置之后,我们最后再做件事情,就是调用下面这个方法,咱看这方法啊,叫author这个K这个方法。来进行身份的一个认证,其实这个过程中呢,它就会调用我们自己编写那个叫user details。
21:09
写一下啊,De details service里边的方法进行这个就是查数据过程,或者说认证过程,所以这是里边的第三步中,它主要就做这个事情,把你调个数据放到这个对象中去,然后里边放入一些相关信息,最终调方法做这个身份认证,也就是查数据过程,所以它里边主要就是做了这个事情。这个各位给他知道啊,然后这个过程给各位再重复一遍啊,也就是说我们在第一步的时候呢,咱在它的复类中有一个方法叫这个attempt进行这个认证,而认证里边怎么做到呢?咱也看到了,首先判断是否是to提交,然后得到表单的,用密码得到之后把它进行数据的设置和封装,最终调那方法进行认证,比如咱们调那个users details进行这个这种过程,所以它里边我们在这个username password auto filter中看到它里边一个更详细流程,它里边是这么做到的,这个各位给他知道,就是通过源码你至少知道里边这么一个基本的流程。
22:22
所以这个我们就完成了啊,然后这个完成之后,下面咱们继续往下看,还是给它看到更深入点啊,比如说咱们现在的任务就是扒它的源码,看源码中怎么做到的,而下面咱们看什么呢?燃钢地方,因为刚才我们这里边。这些不好说,就得到我们数据,然后咱们下面重点看这行代码,这行代码中呢,咱是不是构建出了这个username password autoation to这个对象啊,但是这个对象里边,它里边是怎么做到的,就是把这个构建过程我们做一个说明。那我们来写一下啊,就咱们来查看一下。
23:02
这个的一个构建的过程。那我下面带着各位咱就来详细看一下哈,看它是怎么做到的,首先各位注意啊,就是这里边的username password author token,其实它是一个接口的实现类,它就用那个接口就叫authors,包括这个类中有两构造器以里边讲的内容,那咱下面就把它详细来看一下啊,我们来看一下源码。首先我们先来搜索一下啊这个。咱们看啊这一个类,然后这个类呢,其实它是一个接口实验类,它实现了刚才我们说那个接口啊,只是之前继承了一个抽象类,然后在这里边呢,有两个方法,这两方法对应的是什么呢?一个是你就是未认证那个方法,一个是认证成功的方法,那我们看一下里面的方法啊,首先咱们看第一个方法就是。
24:04
这个方法,这个方法就表示啊,未认证用心方法,然后下面这个方法就表示你认证的方法,他们的方法就是传入不同参数,然后做到不操作,然后你看啊,这个是未认证,这个是认证的。它里边就是做了这样的处理,然后在里边主要其实有一行部分啊,大家看这个部分。你看啊,这个值是不是叫false,这个值是是叫触,这就表示啊,标记成它是位轴,这行就表示标记成它是一个已经认证的这么一个就是信息,所以它里边主要有两方法,一个认证,一个未认证。给各位啊,咱就截个图。我在里边就特别标注下了,因为这个应该不难理解啊,这是一个。未认证的那个方法。然后下面这是一个已定。
25:02
认证的一个方法。所以这个啊,是我们看到的它里面的进一步这个源码,就这个username partword author kitchen token,它是怎么样一个构建过程,也就是咱们看到的这部分啊,然后刚才提到了,它其实是实现了一个接口,那咱把这接口也可以看一下啊。这个接口,接口名字就叫这个O。Ath就是en t,你看它啊,咱们看一下里边有这么一个接口。咱们给它找到啊,你看这个啊,这个接口,然后我们看啊,这接口中的也是有多个方法,包括第一个你看就是第一个是个是不是集合呀,它就代表圈的集合,包括有用户这些信息,就是这是一个密码,就是它那个详细信息,包括里边有一些其他数据,还有最后一个它是否就是被认证,这里边的处表示认证成功,False表示失败啊等等这个信息,所以这个啊,我们做了一个说明,就关于他这个基本的一个过程。
26:12
然后过程给各位再重复一遍啊,咱先开始把它的源码做了一个详细查看。这个啊,给各位截一下啊。它是一个接口。然后这过程我们再说一遍啊,就是这个过程中呢,首先在我们这个username password al filter的附类中,我们做这个操作,判断提交方式,然后调用方法进行认证,包括赛审策略,如果成功失败做功能处理,然后他在调这个认证过程中,也是判断提交得到数据,然后把数据方腾对象调记问认证,最终调用方法进行身份的认证,比如调我们那个user details,然后它在构建这个对象过程中用到这个叫username password author token做一个构建里边两个方法,一个未认证,一个认证,True表示认证,False表未认证,包括它是一个接口实验类,所以咱刚才说的是通过源码看到里边的这么一过程。
27:13
这个各位都知道啊,然后这个看完之后呢,咱可以继续再往下看啊,下面咱要看什么呢?其实看的就是刚才我们里边的第一个部分咱来看啊,比如咱刚才看到那个方法里面我们再找到。也就是里边的。这个部分因为咱们看啊,这个部分中他要干什么呢?刚才提到他是不是要进行我们那个认证的过程,也就是调我们那个user detail,然后里边就是用这个方法做这个认证,那咱下面就可以把这个方法它具体是怎么做到的,给各位再做一个具体说明,就是一个深入讲解。其实这个过程中呢,它用到的是一个对象,这个对象名字啊,它就叫这个provider manager啊,就用到这个对象,那咱们也就做个查看,目前咱们先把它的基本过程,各位通过源码有一个认识,就是通过源码我们能更好了解它一个这行的流程,那这个咱们一会儿做一个具体的查看。
我来说两句