00:00
各位同学大家好,刚才呢,我们给大家说明了通过security如何实现用户认证的过程,我们通过查看源码,用bug方式给各位演示了它的实验的过程,那下面呢,我们结合项目实际,通过spring security在项目中进行用户认证,那咱们看该怎么去实现,首先大家看啊,在这个过程中,这里边有这么一部分叫做alu manager,在这里边呢调这个方法叫an实现认证,而在认证中里面涉及到有很多的操作,那咱们可以再看一下啊,我们找到这个里边的这个an这个方法,然后把方法找到。打开之后呢,我们看里边啊,首先在这过程中呢,我们做法就是调用方法进行委托,然后在方法中我们进行具体的实现,在实现过程中大家看啊,首先我们的第一部分,咱们在里边进行用户名和密码的校验,就是见证你的密码是否正确,另外咱们调了一个方法,得到当前这个用户的信息,然后进行校验,然后校验过程中,在里边我们返回一个叫user detail对象,这都是刚才提到的,所以咱们操作中需要把里面这些内容进行自定义操作,也是我们要实现一个自定义的组件,那咱们看怎么来做啊,这里边给大家来做一个分析,首先第一个我这里写一下啊。
01:30
角位置,我们要进行一些自定义组件的编写。然后组中首先我做第一个,第一个这里个users users里呢,我们这个相关的这个用户的对象,而咱们现在要结合我们的实际,把这个对象进行自定义。这是咱要做的第一部分,因为咱们的对象是那个system user啊,这个也明确,所以一会儿我们先来实现这个事情,然后这个之后我们在里边呢,还有第二个部分,第二个是什么呢?大家看啊,我们刚才在操作中,刚才咱们看到这里边呢,它会一个方法,这个方法叫load user by username,所以咱把这个方法进行自定义,就是根据用户名来查我们的数据库,然后把数据最终得到,这是第二个组件,我们要进行实现。
02:29
给各位先写到这里,咱们马上进行,然后这个之后呢,在里边我们还有第三个组件,三个组件是什么呢?我们来看一下啊,比如说咱们还是找到这个方法中来。到这个个在下面呢,它要进行这个密码的校验,然后它调这个法校验,在校验过程中里有一个校验password ECO,所以咱们需要把它做一个自定义。
03:07
定义这个密码的校验器,它叫做password ECO的,比如说我们现在可以通过MD5完成校验,所以咱们的第一部分需要自定义三个组件,我再说一遍啊,第一个就是user details,结合我们的实际,根据我们项目的实际来自这个对象,然后第二个我们写个方法,Load user by username,根据用户名称得到用户信息。第三个写一个自定义的密码校验器,我们通过MD5方式进行加密,然后完成校验。以上就是第一部分。组件,然后这个组件写完之后,咱们还需要写我们的第二部分,第二部分呢,写一些具体的过滤器,或者说具体的这个核心的这个部分,或者说核心的组件,那这里边要写什么,我们进一步来看啊,首先我们写的过程中,大家注意第一部分咱们是要做登录,所以咱会写一个登录的这么一个借口,就是完成登录过程,然后登录什么样一个过程呢?就是判断我们的用户名和密码是否正确,这过程中用到咱们这个校器啊,自行义这个校验器进行密码判断,然后如果说登录成功之后,我们会生成这个token,把它进行返回,这是要写的第一个就是登录的部分,具体说其实它是一个filter过滤器。
04:37
这是第一部分,然后第二部分呢,我们还要写个组件,这个组件是什么呢?就是做这个token这个解析的操作,或者说叫认证解析token这个组件,这个组件是干什么呢?咱之前提到了啊,当我们登录之后,把我们的token是不是放到了请求头里边,所以在里边咱做个判断,判断请求头里边是否有你的token,如果说有的话,咱们表示你的认证就是完成或者认证通过,如果没有的话,那表示失败,咱们需要写上这么一个组件,就是认证解析ton,一个是进行登录,一个进行判断,然后之后呢,我们在里边还会有第三部分,第三部分做什么呢?在我们这个spring的配置,来配置你相关这个认证的部分。
05:31
比如你的是哪个认证类啊,包括里边哪部分做登录,哪部分做这个解析等等,就是咱们之前在spring里边。大家注意这个,然后在里边完成相关的配置。所以以上啊,是咱们要完成用户认证的一个基本过程,这个咱们做了一个说明,我再来重复一遍啊。然后咱们进行具体实现,首先第一部分,然后进行认证,它的认证呢,会调用里边这个方法,就是刚才我们看到这个方法,然后方法中咱们自定义三个组件啊,就是这个方法是做认证的,咱们有三个组件,第一个就是我们的用户对象,咱们自己来做一个封装,然后第二个我们写个方法,根据用户名称做查询,第三个写一个定义这个校验器,通过MD5进行加密。
06:26
然后第二部分写它的核心组件,第一个组件就是登录,判断用户名密码是否正确,生成token,第二个解析token,看请求头里面是否有token,有的话认证成功,没有的话失败,最后在配置类中完成相关认证类的配置,通过以上这些步骤,咱们把这个用户认证最终可以完成,那下面呢,我们继续来写一下这个功能,咱们来看一下啊。首先我们的第一部分我就按照课件中的顺序了啊,但是顺序其实无所谓,你先写哪个都可以,但是可能都要做,我就按照课件的顺序经完成,首先第一个我们定义一下这个加密的组件,就咱说这个。
07:11
Password coding这个组件,那这里边我来写一下,咱们看怎么做啊。现在在这过程中,首先我在这个模块中,我们先来创建一个这个包,我起个名字就叫做custom,就是自定义,然后创建之后在里边我们写上一个类,这个类我就从课件中直接复制了,咱们把它看这类password,然后咱们让呢来现一个口就们到这个。Password实现这方,然后方法里面的具体内容我就从课件中直接复制了,咱们现在通过MD5完成这个加密。
08:14
一种依赖,然后把两个方法在里边我们写出来,然后大家看方法中用到了这个MD5啊MD5,但之前有这个工具类我们都之前用过了,所以现在一部分自定义这个校验器这部分就完成了,或者加密器我们就做到了。啊,这是第一个啊,然后第二个呢,我们自己来装一个user,或者说用户对象,咱们通过这个user detail进行实现,User detail里边呢提了一些,就是通用的属性,合我们的实际,跟我们肯定不一样,因为咱们当前的对象是这个user,所以咱们第二部分来做一个封装,就这个用户对象。那我写一下啊,首先我们在里边现在创建一个类,这个类呢,我就叫做custom user,然后user里边让他一个类叫user啊,就是user detail这个user。
09:12
让他继承一下,我就复制了啊这个部分。这个咱们直接。过来,然后让他。继承一个。User,注意包不要导错啊,是我们security里边这个user,然后大家看这结构中啊,这个user是不是也实现了user就咱用它进行实现。然后之后呢,我们这个。里相这个们来家看啊,System们己这是我们自己的对象,System user就是然后在里边有相关的这些,现在就可以了啊,这个引入的时候呢,我们这里边有一个小问题啊,因为要用到这个system user,这个是model中的,而在我们当前这里边应该没有,所以咱把那给它引入进来啊,为了能用到这个实体类。
10:10
我们给他引入一下啊。咱们看其他的里边,我就从其他里边给它复制过来了啊,咱找一个啊给他拿过来,因为要用到那个model的部分。应该在我们这个位置应该是有啊,就这个啊,把它拿过来,因为用到那个实体类嘛。这个给他。复制过来,然后里边我们再来到这个里依们给入。啊,这个就进来可以,然后里边有一些其他的相关的内容。所以现在啊,把这个组件我们就完成了,就刚才提到的user自定义,然后定义密码校验器,然后之后呢,我们再写个方法,就是写这个user username根据用户名行查询,那怎么做,我这里写一下啊。
11:07
首先我们在这个interface interface在这里边呢,我们定一下这个方法,把方完成定义。这个拿过来。大家看啊,这个方法就是根据用户名称进行查询,这咱就完成了。然后这里边啊,把它依赖引入完成之后呢,咱下面来实现这个方法,因为这个实现咱需要去查数据库,所以注意我的做法啊,我这么来做,在里边定义接口,它的规范,我把它的类到service OA里进行,现因为OA里操,现在这个OA里边加上它的实类,咱们加一下啊,实类中首先给起个名字。
12:10
这个名字,为了各位看着方便啊,我就从课件直接复制了user service l PL,让它实现这个接口。User service实现之后,里边这个方法我们进行实现。这个方法啊,然后这个方法中就是根据用户名称进行查询啊,就是咱们看到这个部分,那这里边我把它快速写下啊。首先加上一个注解,就交给使用管理。这个然后在里边因为查询。最后把这个给它注入进来。System user。Service。注入之后在里边根据用户名称我们进行查询,那我们写一下啊,根据用户名称查询,咱们应该是没有这个方法,那我写一下啊,Get user。
13:09
根据。Userme进行查询,里边这里啊,咱们重新建个方法,然后给它写一下啊,返回的是这个user这个对象。我给他。返回一下,现在这个方法创建出来了,根据用户名进行查询。方法写完之后,咱们在这里边把方法创建,然后进行具体的实现。这位置创建这里边做一个实线。然后我把这个方法咱们快速写一下啊,根据用户名查询。写的过程中,首先我们通过lada queryper加上system user,等于上一个lada在里边设置它的条件就是根据用户名进行查询,那我们来找一下啊,用户名就是username。
14:15
查询之后调用方法得到我们最终结果,这个方法我们写一下啊,应该用这个。Lightlight。大家看这个方法啊,Select y,因为用户名称肯定是唯一的,它是不能重复的,所以用Y咱们直接查就可以了,传入rapper,返回对象,把对象进行退。现在啊,这个就快速完成了,咱们再回来啊,在这里边根据用户名我们完成查询,然后查询之后在里边做一些判断,最终返回封装就可以了啊,这个我拿过来大家看啊,如果说等于空,直接抛异常说这用户名不存在,如果说这个值等于零,表示账户已经停用,最终退这个对象,这个对象就是咱刚才写那个custom user里边传入我们自己查询之后这个对象。
15:12
所以现在啊,大家看啊,这张图里边咱就把自定义的三个组件就完成了,User对象自定义,自定义这个方法根据用户名称查询,自定义密码校验器,通过MD5进行加密,所以这部分我们就完成,完成之后呢,下面咱们做的是写里边的核心组件,包括登录认证,包括解析ton,以及在配置类中进行配置,那咱们马上进行核心模块核心组件的编写。
我来说两句