00:00
各位同学大家好,刚才呢,我们完成了此文security的入门例子,通过它我们看到实际中我们一般是自定义里边的组件完成相关的认证授权功能,那下面呢,我们先开始实现用户认证过程,认证过程怎么做?首先我们先分析一下spring security里边的执行流程,咱们先看一下这张图,然后通过源码给各位来分析一下是如何完成用户认证过程的,那咱们下面看一下。首先这张图给大家先做个说明,这张图中画的就是supreme security认证的流程,那我现在把这个图给大家放到这里,咱们来解释一下这个图是什么意思,那我们来看一下啊。首先咱们往上看,上面有12345这五个是它的核心的组件,第一个就是username password,这个filter,包括等等这个内容,那它是怎么做的,咱们看它的流程,首先第一步,因为咱要进行用户认证,就是用户登录,咱是不是要提交用户名和密码,当我们提交之后,在我们这个filter里边呢,它会把这两个值得到,得到之后呢,封装成一个对象,就里面这个author,这个对象封装之后它怎么做调用方法进行认证,包括认证你的信息,然后认证的时候呢,因为它要得到我们输入信息和咱数据库中信息,所以怎么做,它会调一个方法叫load user by username,根据用户名称得到我们的用户数据,最终反一个对象叫user detail,这个过程我们可以查询数据库,然后得到之后呢,再进行校验进行。
01:49
比对,只要根据密码进行比对,因为它的密码呢,默认有一个加密的组件,然后咱们可以自定义最终比对,如果说都正确,最终填充到这个auto对象中,最终返回,然后把这个对象最终放到这个叫security contact ho,就是上下文对象中,为了咱们能取到。
02:12
这是一个最基本的一个说明,我再说一遍啊,然后咱们看一下源码第一部分。提交用户名和密码,然后咱们在里边得到,得到之后呢,我们在里边调用方法进行认证,在认证过程中,根据用户名咱们查数据库,得到我们的用户信息,然后进行认证,把你输入的跟数据库中做个比对,看它是否一致,如果认证都通过,最终咱们填充到一个对象中,叫auto里边,返回到上下文中,为了我们最终使用,这就是一个基本的认证的流程,这个咱们说到这里,这个图各位要能看懂,然后之后呢,下面咱通过源码给各位来分析一下这个过程,那我们来看一下源码。
03:01
首先第一个呢,咱们直接啊,在里边点中idea中的快捷键ctrl shift out n,然后在里边我们找到第一个这个类,它就是这个,我这里写一下啊。就是咱们刚才看到的这个类,Username password filter,那这个类我复制一下,然后咱们到源码中来找一下,通过它咱们一步一步来看一下它里边的底层是怎么实现的,也就是这个。我把这个找到。然后到里边我们来搜索一下。我放到这里,然后呢,给它打开,呃,多了一个引号啊。打开之后,我们通过它,咱们就一步一步看一下它的流程是怎么样的。大家看到啊,这个是一个filter过滤器,然后它继承了一个叫obstruct,这个OBS processing filter在这里边有它的主要方法,这个方法中咱先看一下啊,有一个叫do filter,就进行过滤,当我们过滤之后,最终咱是要放行,放行那就到我这个认证成功的方法中来。
04:16
这时候我们看到这个过滤器,然后大家看这里啊,就是咱刚才说的最后一步,我认证成功之后,把信息放到咱这个上下文对象中啊,这咱看到最后一步骤,然后咱们看细致点,首先这个类呢,继承了它的这个obstra,这个filter,然后在里边有第一个方法,这个方法大家看一下叫attempt。Al,它表示得到咱们输入的信息,就是咱刚才看到的第一步,我们提交信息用它可以得到,那怎么得到,我们看一下啊,首先第一个判断提交方式是post提交。然后判断之后看这两行就得到我们的数据,那咱们点进去看一下啊,你看怎么得到,这各位应该很清楚啊,是web中最基础的知识,通过request get perter得到啊,这是我们得到的用户名和密码,然后得到之后呢,把两数据咱们给它去除那个空格,封装到这个叫username password author token里面去,我们做一个封装,然后封装之后我们做一个设置,最终调这个方法进行我们的认证,就是这个author kit方法,就是刚才图里边的这个地方,调它开始进行认证,封装成这个token对象,最终调方法进行认证。
05:35
那咱们点这个方法看一下,现在我们记住,然后进入之后我们看啊,它是一个接口,里边有很多实现类,那咱找哪个呢?找最后一个叫provider manager,把这点开,大家看里边它做了什么事情,我们来看一下这个代码,首先定了一些初始值。然后看这里啊,这是什么,是不是迭代器啊,通过迭代器它进行迭代便利,然后在下面开始做这个认证,在认证中呢,它调用了这个方法叫OS方法。
06:10
通过这个provide进行调用,然后咱们点进去看一下这个方法,这个方法也是一个接口,找到它的实现类,咱们找第二个实验类,Abstra user detail author provider,把这个点开,点开之后我们看啊,这里边就开始做这个校验,首先用户名啊,包括你看啊,咱们看核心步骤,大家看这步什么意思,咱就看这个名字就应该能猜到。Get user from,什么是不catch,就是从缓存中取数据,因为它有一个缓存的一个实现,如果它等于空,那我们实际查询不等于空,往后进行,那咱看如果说等于空,那我们查询调这个方法来看,这个方法啊叫re。这个user也是我们这里边。
07:00
提到这些啊,就这位置查的这个过程,然后咱们找这个方法,这方法咱们点开大家看,它就是调这个detail t里面这个方法叫load by username,然后进行查询,然后咱们看啊,这里边有一个接口,接口注意它只写的接口,咱们一会儿要写他实验类自己来做到,所以他就通过这个方法,然后进行这么一个查询,咱们再回来啊,找到刚才这个位置就是在这里。然后他查完这个值之后,根据用户名查询,最终把它进行返回,咱们再回到刚才的方法中来,就刚才咱们最开始看到的这里啊,他就得到这个就是用户信息,然后得到用户信息之后,下面怎么做呢?大家往下看user,你看做了什么,咱看这单词叫check,是不是做校验呀,他就做各种校验,或者说各种判断,咱们看核心的啊,主要看这个。然后在里边我们继续点进去,大家看啊,它就做了各种判断,主要在这里,这是什么,是不是密码呀,根据密码进行匹配,因为咱的密码做了一个加密或者编码,所以用这个进行处理,然后最终进行匹配,看它是否一致,他做了这个处理,然后咱们继续来看啊,我们再回来。
08:19
回到刚才这个画中来,他这里边如果说校验或者说验证通过之后,然后他做了一个事情,这个事情。注意啊,是不是叫开,咱们刚才有一步骤是从缓存中取出来,那这步表示当你校验完成之后,那把数据就放到缓存中去,最终我们就是调这个方法叫create success autocation,然后把这个对象最终返回还是这个username password authorken,所以现在它做了一个校验过程,然后校验之后,最后咱再回到我们最开始那个filter里边,回到这里,然后filter里边呢,咱们找到它那个负的这个过滤器。
09:01
在这里边咱刚才看到啊,当我这里边就是校验成功之后,它会调这个方法叫successful,然后在里边完成你的就是成功之后操作,我们把这个数据放到上海文对象中,最终反应信息,如果失败的话,调这个方法最终进行返回,所以以上啊,就是咱们说这个认证的一个过程,大家把这个过程给他好好去看一看。咱们现在就做了一个说明啊,就是以上把这个认证流程,包括源码的查看咱们都说了一下,我课件中写的是一个核心的部分啊,刚才带着各位也看了一遍,所以大家把这源码给它自己去过一遍,其实源码这里这么来理解啊,源码咱们单独拿出某一段它并不难,它的难点是什么?就是调来调去咱们一点往往就点乱了,所以各位记住我刚才这个过程自己可以通过这个源码来查看一下security,它的认证流程是怎么样。
我来说两句