00:01
各位大家好,欢迎继续收看上硅谷视频课程,我们定来学习spring security。在上节课内容中呢,我们讲到了在web确认方案中如何来设置用户名和密码,咱们演示的三种方式,第一个通过配置文件,第二个通过配置类,第三个写一个自定义的实现类,把过程实现,然后咱们下面继续往下学习。咱们在最后说到这个自定义实验类设置的时候,我们曾经提到这个过程呢,咱们在之前演示中,我们是直接在我们的里边写固定的用户名和密码,但是实际中我们这个认证过程,咱们的用密码是不是都要去查数据库啊?所以咱下面来做件事情,做什么呢?咱就通过实现一个数据库查询来完成用户认证过程,就是把咱们之前的例子加上查数据库的一个过程,那我下面给各位做个实线,那怎么做,咱先做一个基本的分析。首先咱们看到。
01:09
咱们之前呢,写的一个类叫这个my user details service,在这里边,当时我们是写了固定的用名是密码,但是现在利用密码咱要通过数据库查出来,看它是否正确,就是这过程中咱加上查数据库的逻辑,这是我们要做的事情,那怎么做给各位详细分析一下。我在里边写一下。咱通过查询数据库完成用户的。这么一个认证,那这个过程中呢,咱们在我们之前的基础之上,就需要首先第一部分整合进来一个框架,这框架就是查数据库的框架,但是这个操作数据库有很多技术,比如说你用最原始的GDBC没有问题,你整合这个my business plus可以整合my be可以都可以做到,但是我现在为了方便,咱就给他整合进来这么一技术,就这个my be。
02:11
Plus用这个来完成数据库的操作,当然你用其他方式也可以做到,针对买plus,如果各位想了解这个技术中的更细节问题,可以关注上微股股里学外,里边有详细关于这个技术介绍,我这里边就把它直接整合进来,所以咱用它完成这个操作。那怎么做,下面给各位来具体演示一下,我在这里边一步一步给各位都详细说清楚。首先里边的。第一步操作,咱们在里边呢,就先引入相关的一些依赖,因为咱要用到my bit plus,还要操作数据库,所以咱们必须有买bit plus这个依赖,还有咱们数据库,也就是买circle的依赖,另外咱为了操作方便,再引入一个工具叫loanbook,就是让咱们的实体类更加方便,所以这是我们的第一步,那我把它引入。
03:11
这依赖不需要各位记,我这里边在文档中给各位都提出来了,你把我的依赖直接复制可以了,咱看一下啊,这个是。的,包括security的,包括咱往下看,看到它各位看到这就是my bit plus的,然后这是买circle的,还有一个叫log book,是为了简化咱们那个jarb的编写,所以我现在把这三个依赖咱们就复制到我们项目的破文件中,这是我们的第一步,先用依赖。那我现在把这些先关掉。然后在碰里边,我把依赖我就直接复过来啊,我应该提前复制了,就是里边这三个依赖。这各位知道啊,一个是买with plus,一个是买circle,还有一个叫loanb,为了简化操作,但是loanb可以没有,因为咱不用它也能做到,但是这两个必须要有,一个买plus,一个买circle。
04:11
我把这个给各位截过来,这是咱们的第一步。为了整合进行使用。然后这个做到之后,咱们下面继续往下进行,因为咱们现在是不是要操作数据库,所以我是不是要有数据库,还有数据库表啊,所里边的第二步操作,咱们就是创建数据库和数据库的这个表,但是这个表呢,咱后面随着内容的增加会有多张表,我现在先简单建一个用户表,为了咱们操作这个认证过程就可以了。那这表我这里边提前创建过了,我的数据库叫DEMO表,叫users,里边有三个字段,ID、用户名和密码,这个是我快速创一个表,各位按照这个工具把它快速创建可以了,这是我们的第二步操作。
05:04
把这个给各位借过来。然后这个做到之后,下面我们进入到第三步,第三步呢,咱们针对这个表是不是要写个实体类啊,就是为了咱们后面操作更加方便,你做数据的获取,或者操作更加简单,所以咱们写。第三步,创建你这个user表对应的。试题类或者说这2B,那我现在在里边创建一下,首先在这过程中呢,我先建个包。这个包,比如起名叫anti尸体,在anti这个包里边,咱们建一个类,这个类的名字我就叫。Users user里边呢,加上三个属性,因为咱有三个字段嘛,第一个就是这个ID。然后第二个是。用户名。Username,第三个是密码。
06:04
这个password,然后洗完之后,咱们是不是要生成这三个属性对应的get set方法,包括to string等等方法,这个方法我们可以生成,但是我刚才有一个依赖,大家看到这个loanbook,用它可以简化,你在这上面啊,这加个注解,这注解叫贝。去这个date加上它之后,又可以把里边对应的get set方法都可以生出来啊,这就是一个简化开发,但你不用它直接写get赛的方法也都一样的,咱只为了简单把这个直接用一个插件给它生出来就可以了。包括啊,这里边咱们看到你看这个类对应的这个方法,Get set to string是不是都有了。所以这个啊是我们的第三步,创建对应的设计类。这个咱就完成了,然后完成之后我们进入到第四步,第四步呢,咱就开始编写,这个就是操作数据库部分,也就是我们买base plus的部分,那100BIT plus呢就是用法很简单,咱们只需要写一个接口,让这个接口呢继承买plus中一个接口叫base map口,然后就可以使用了,因为在MY中帮我们封装这过程。
07:25
然后咱们下面给它整合进去,就是咱们的第四步。我写一下。咱们就是整合,我就简称叫MP了,然后里边创建接口继承。MP里边那个。接口叫这个base mapper,那咱们给它快速写出来,就现在在里边呢,我再来写一个包,这个包就叫。Map map里边注意啊,咱们创建的是一个接口interface,比如接口我就叫user。
08:03
Map,然后my plus怎么用的,你让这个接口啊,直接记成一个接口,这接口的名字叫这个base map。然后里边加上泛型,就是你对那个实体类,咱们这实体类叫users,把这加上,而base map大家看。是不是由MP中题目接口,这接口里边呢,有针对数据库的增删改查操作,里边都给咱们封装了,咱们只需要继承它,然后调里面这个方法,这功能就可以做到啊,这就是一个最简单的使用,所以咱们现在把这个就整合进来了,创建了买plus里边这个user maps这么一个接口。这个是我们的第四步,所以咱们把这个做到,然后这个做到之后,咱下面就在里边具体使用一下啊,就是第五步我们开始使用,也就是说呢,咱之前写那个user detail t里边是写固定的,咱们现在要查数据库,把这个做到,所以最后一步我们就写它。
09:13
写这个detail,这个service。那各位把步骤写完整,这咱们的。第五步,我们在这里边呢,就这个detail service里边调用咱们这个。Map里边那个方法去查询数据库,进行用户的一个认证,就是看你的数据库里边啊,有没有这个用户啊,就是来做这个事情,这是我们的。第五步,那咱们看怎么来写,给各位写一下啊。咱们看啊。是在我们这个过程中,首先呢,咱们在这个detailwi里边是不是要用到map中的方法呀,所以首先第一步怎么做。我觉得各位同学应该能想到你要用谁,把这是不是要注入进来啊,所以咱们现在就做一个注入。
10:06
O to,我加个private user这个map加个user map,但你住之后发现啊,禀报了一个错。报什么错呢?他说这个不能注入,就是这么做呀,它也能运行,只是因为你看啊,我这是一个接口,接口理论上是不是要有它对应的实现类啊,但是这里边没有,因为那时现类在里边都给咱封装了,所以咱为了它不报错,在里边呢,咱们可以给它加个注解,比如加一个repery,然后里边你再来看。是就没有错了啊,但你不加其实它也没有问题,也能运行,只是现在这过程中咱让它报错,再加上一个这个注解,它里边的时间内在MT中已经帮咱们封装了,然后这个写完之后,下面我们就调这个user map中的方法。我写一下啊,调用里边的方法去查询数据库。
11:02
然后怎么查,我们之前讲到过啊,在我们这个。Security里边的user detail service里边的,它这位置中有个方法叫load user by nameme里边会得到你表单传回来的用户名,也如这个S就是我们的用户名,而用户名呢,咱根据他去查数据户,看数据库中有没有这个用户,有的话咱就给他设置,没有的话给他抛出异常,或者给他返一个空,那我现在就查一个数据库,根据用户名去准查询。用户名就这个啊,比如咱给他改个名字啊,我叫。Username,那怎么查?我们用到MP中的知识,首先因为是条件嘛,里边有一个对象叫query rapper。里边加上这个user。然后里边我叫rapper,等于new,上一个叫快rapper,这是MP中一个条件构造器,用它来构件,我们的条件还是我强调的啊,MP中的具体的细节内容的各位可以关注上归谷古力学外,里边有详细的说明,我们这里边重点咱不是讲FP,咱重点讲的是spring security,所以这个我就在里边直接使用了,它的细节可以可看相关的视频。
12:25
那咱们往下写啊,这是一个条形构造器,然后咱在rapper里边加个方法叫EQ,就等于因为它要根据用户名查询嘛,而我这个表里边用户名是不是叫username,这就表示你那个username,然后它的值username,就是根据用户名到里边查询,这句话就好比说啊,咱们写语的时候,我加个where条件,然后username。等于的值指是它用MP做到了,然后这个写完之后,咱就可以调这个users map里面一个方法,大看这个方法啊,大家看这个方法。
13:03
调select one里边传告rapper在one什么意思呢?就是得到某一条记录,因为我们的用户名嘛,肯定不能重复,你重复没法登录,然而这里边我们用set one,那返回就是一条记录,用这个得到这个名字我们叫users,所以这样的话,这段代码就是查数据库,然后查完之后下面。咱做个判断啊,比如说我这里判断一下啊,如果说呢,它返回到user,就查这数据等于空,那就表示什么。数据库里边是没有这个用户名,那表示你现在是不是就是。认证失败了,如果这不等于空,那咱们是不是再做我们这个就是new这个对象啊,包括里边反应这个值,那这值需要改一下啊,这个位置之前是写固定的,但是现在值不等于空,我从里边是不是可以直接取第一个user name。
14:00
然后这个值我们就是点盖头。Password把这个做个设置,我加个注释啊。就是从咱们查询数据库返回到user对象里边,得到你那个用户名和密码,然后给他返回。这各位应该能理解啊,这个不等于空,那肯定能得到,如果等于空,那我们让他就是认证失败,那认证失败怎么做呢?多种方式啊,这里面有一种最简单的方式,咱看一下我的课件中,我就把这话直接复制了啊,我不再敲了,你可以直接啊抛异常。这一条名字叫user not found,就是username找不到嘛,这个exception把这个,也就是说把这一场给它抛出去。这个可以看到啊,就是他认证失败,其实抛出的就是这个异常,所以你给他直接子肉妞这个异常,比如提示它用户名不存在,这样的话,咱现在就把这个。过程就完成了,这个是我们写的,在user比里边。
15:04
如何去调用咱们map中的方法,然后去查询数据库,里边主要就是对策代码。我把这段代码给各位截过来啊,然后主要部分我特别画一下这个位置需要设置,然后这里边是查数据库的,如果它等于空,那我们就给它直接子肉溜一个一长就可以了。这个就是咱们的第五步。啊,也就是里边的。这个地方。给各位截过来,所以这样的话呢,咱们到这里为止就完成了查数据库过程,这部分就做到了啊,但是做到之后呢,这里边啊,还有一个最后一步,就是第六步是一个小步骤,但是这一步的不写它会有问题,第六步。做什么呢?咱还需要在我们的启动类上边添加一个注解,这注解叫这个map sky。
16:03
什么就是map扫描,因为它现在map是不是只有接口,而接口对应时间内是在这里边封装的,所以他要找到它实验内,但你现在如果不加注解,那map它是不能做这个注入,所以在启用类上边我们要加上一个。注解,叫这个map开里边加上你的map所在的包的那个路径,就是把这个。家长。给各位啊,我就直接加过来,这一部分知识应该是各位在boot里边讲的这种,我们在第一天第一节中应该提到过我们课程中一个前置知识,那就是损部T损boot,你要注意掌握,包括这里边啊,把map加上,它能找到我们的map,这句话必须要有,没有的话他会报错。就你加到你的启用类上,或者加到你的配置类上都可以,但是这句话必须要有。这个啊,就是咱们的。
17:00
第六步。所以说到这里为止呢,咱们把这个过程应该说就最终完成了,就按照这个123456把这个做到的,然后洗完之后,咱把过程再给他整理一遍,最终我们来做个完整测试,测试呢,一会儿我通过第bug方式测试,让各位清楚的看到它每步是怎么执行的,那咱们把过程我们来总结一遍啊。咱这先关掉一步来看,第一步引入依赖在poem里边,有MP的,有买circle的,还有这个龙B插件的进行开发的,然后洗完之后,第二部分我们在里边呢,就是在这个位置引入这个map,包括实体类啊,实体类就是几个属性,然后map里我们就是继承这个base map把这做到,然后集成之后在底T里边我们就来做这个。注入map调方法得到用户信息,如果等于空抛异常,不等于空返回这个内容,所以这样的话,把这过程我们就完成了,然后完成之后呢,各位看啊。
18:11
我希望各位同学应该能够考虑到啊,如果你有W的这个基础,有boot基础应该能看到啊,咱们目前代码如果说我要运行的话,应该是有问题的。不是,各位是否能看到啊,你注意啊,我们写代码的时候呢,咱们往往不追求一次性成功,因为实际中这个基本上很难做到,代码肯定会遇到问题,遇到问题呢,你能快速定位到,而我现在代码虽然说按照我这个固定的六步骤把这做到了,但是目前其实里面是有一个问题的。不知各位是否能看出来啊,我希望各位应该能找到这些基本问题,就是以后你再遇到问题应该能快速定位到在哪里,所以这里边我们写一下啊,其实这个位置还少了一个地方的配置,咱就算成第七步。
19:03
少了什么地方?注意我们是不是要操作数据库,但是你看我现在配置中我有设置我操作哪个数据库吗?我数据库用户名密码是什么,是不是都没有设置,所以还需要这个步骤,咱就需要在配置文件中把数据库信息再做配置啊,就缺少这么一个步骤。那我写一下啊,就是配置数据库的那个信息,那这个信息呢,在我课件中应该都有,就这段话嘛,我把这段话咱就直接复制过来。放到咱这个application点配置文件中报各位看啊,有驱动,有你的地址,用户名密码,我这个数据库的是DEMO,我的用户密码都是root。然后这里边特别强调,因为咱们现在用的boot是2.2以上的这个版本,所以这个过程中呢,它默认支持的是买CIRCLE8,就是买circle,你看啊,我这里有依赖。
20:03
但是我是没有指定版本,默认是MYSQL8,但你可以指定,如果你用到MYSQL8的时候有一个问题,驱动要换成这个驱动。加个CD,然后你的地址中要加上这句话,就是一个市区,因为大家知道咱中国是不是属于东八区,所以把这加上,这是特别注意的啊spring boot2.2开始,它默认支持是MYSL8 MYSL8的时候,你的驱动加一个CD,然后地址中加上一个时区。所以这样的话,这个我们就完成了,就关于咱们这个。具体的这么一个案例。这个咱们就做到了啊,我把这个给各位也是。截过来。放到我们这个位置。就这个啊,这是我们的最后一步。这样的话呢,搭建完成了这个基本环境,然后搭建之后,咱们最后把这个做一个完整的测试,看一下它的效果怎么样。
21:04
那咱们马上开始测试。
我来说两句