00:01
各位大家好,欢迎继续收看上硅谷视频课程,咱们继续来完成任security这个案例。在刚才内容中呢,我们编写了security中相关的工具类,还有它的处理器,咱们写了三个,第一个是针对密码的处理的这么一个工具类,包括对密码进行MD5加密,然后第二个是生成token的工具类,咱们通过JWT生成token,包括根据ton字符串得到用户名称,然后第三个就是退出的这个处理器。当我们推出之后,咱从这里边把ton移除掉,并且从write里边把这个值给它删除掉,所以刚才我们写了这么三个,然后咱们下面继续往下编写,下面这里边呢,还有一个处理类,就是关于你没有授权的处理类,那咱下面把这个再给它完成一下,就是里边的2.4。
01:01
嗯。未授权统一的一个处理类,比如现在我们操作中你没有授权,然后进行访问,让他就统一返回我们这个内容,那这个给各位来写一下,咱们看这该怎么做。我在这个位置,首先咱们现在啊,还是创建一个类,然后让这个类呢,实现一个接口,这接口叫an author entry point,它是针对我们未授权的一个接口,那咱把类创建一下,比如这个类我叫an author。叫鹌。Point。这是我们写的一个类,然后咱们让这个类呢,实现这么一个接口来实现一下啊这个接口。这个接口名字叫做also。我给他写一下啊author,哎,不是这个啊,Author entry。
02:05
Point就是这个接口,然后把它引入,咱们来看一下这个接口,在这接口里边呢,它有一个方法,这个方法就是你未授权的时候会执行这个方法,然后咱在里边可以做一个统一的一个输出,那我们来写一下啊这个方法。在里边呢,咱就直接用咱们之前那个工具类response u里边那个out方法,然后传入这个response啊,就是这个啊response。然后后面咱通过R里边的这个IO方法做一个输出,所以这样的话,咱就把这个。处理类完成了未授权统一的这么一个处理类,这各位给他快速写出来啊,这咱们就写完了啊,所以咱们到这里为止呢,咱就把这个代码里边,我们这个相关的工具类。
03:02
还有它的处理类,咱给他都写完了,对应咱们目录中,就是这个目录中的相关的内容。那咱们完成了啊,然后完成之后,下面咱们继续往下来写,下面咱们写什么呢?我们就开始啊,完成里边的这部分,就是它这个filter的部分,那咱给他完成一下啊,关于这个filter。我们来给他写一下啊。咱们看啊,Filter里边呢,我这位置自定义,咱们写两个过滤器,一个叫token烙印,一个叫token author,就一个针对认证,一个针对授权,因为咱们做认证授权过程中,需要咱们自己写的逻辑,主要针对token,包括ready的操作,包括hier等等操作,所以咱需要自己写这两个过滤器,一个认证,一个授权,然后认证的过滤器呢,我们要让它继承一个过滤器,这过滤器咱之前提到过,叫username password author filter,然后授权让它也是继承一个过滤器,这过滤器的名字。
04:12
它叫做base author filter,所以咱们下面把这两个过滤器我们做一个实现,就是针对认证和授权的两个自定义过滤器,因为在里边我们要实现自己的一些逻辑,那下面给各位咱们就来写一下。我把这个拿回来啊,咱编写这个表过滤器。编写自定义的认证和。授权的过滤器。那首先我们先写这个,就是认证的过滤器,看这个该怎么写,给各位写这位置啊。认证的过滤器,那这个我在代码中咱们做一个实验,这些我先关掉,然后代码里边呢,比如现在因为咱要写过滤器嘛,我先创建一个包,这个包我就叫filter,在filter里边呢,我们先创建第一个类,比如第一个类我起个名字啊,我们就叫这个token。
05:15
Log in。Filter,因为它是用到token这个东西嘛,这个写出来了,写完之后让他继承一个类,这个类就是咱们之前提到那个过滤器,它叫做username。Password这个叫author filter啊,那这个类呢,我直接搜一下,咱们给它直接复制过来,因为之前咱也看过这个类的这个源码,包括里边一些基本内容啊,咱给它搜索一下啊,找到这个类,然后给它复制过来。我们找到啊,应该就是里边的这个就是它,然后现在我把它复制过来,咱用这个,我们自定义这个过滤器,就继承这个。
06:00
Username这个filter,然后在username里边,咱之前提到了,里边主要有这么几个方法,这方法咱先看一下,然后说一下我们怎么写,首先一会儿呢,咱们先重写第一个方法,这个attack这个方法,在这个方法中是不是能得到你表单挑过来的用户名和密码,在里边咱们得到之后做一些相应的处理,这是第一个,然后这个得到之后,我们再重写里边的第二个方法。因为各位注意,当我们登录成功之后,是不是掉一个方法,这个方法咱找它的父类。就是里边的咱看一下啊,这个方法调四个successful author在这里边表示认证成功会调用,所以咱在里边实现我们的逻辑,咱的逻辑是什么,是不是就是生成token,然后把它放到咱的RA里边去,然后这里边还一个方法,这个unsceful就是你认证失败做了一个处理,所以咱们在里边我们就重写这三个方法,第一个type得到用密码,第二个successfulful,认证成功,第三个UN successfulful就是认证失败,那咱们下面给他就具体来写下这个过程。
07:16
这个位应该给到知道啊,应该都是咱们之前提到过的,因为之前咱也看过源码,看过里边的这么一个方法。那我们来写一下啊,首先我们写第一个方法。这个方法就是获取表单提交过来的用户名和密码,然后里边做一些相应的处理,包括还有你那个相关的权限等等一些信息。然后这个方法我到这里边把它复制过来,咱们给他就直接重写一下啊。就是这个。我把它直接。拿过来,然后在里边,比如说为了防止写错,我来一个override。在里边写上这个方法。
08:04
这样的话咱就写出了。第一个方法里边具体逻辑咱一块儿来做,然后咱再写第二个方法,第二个方法是什么呢?当你认证成功会调用的方法,然后这个方法我们写下overri,加上里边的就是这个。叫做successful这个方法,我把这个方法给各位也是分过来就是它啊。呃,比较长啊,给他拿过来,然后写到我们的这个位置。我把这方法先给他写出来啊,这是第二个,然后第三个就是我们认证失败会调用的方法。这个方法叫做uns successful,就是咱们刚才看到的。这个方法我把它给各位也是复制过来,然后咱们重写一下这个方法。
09:02
我直接复制啊。然后咱们看一下这里边有这么一个结构,哎,没有这个啊,把这去掉。这样的话,咱们把三个方法就给它列出来了,这是我们token烙印,就是你认证过滤器中的一个基本的一个结构,结构写出来了,然后写完之后在里边我们写一下具体内容。而在这个过程中呢,因为咱们做这个就是认证过程中,他肯定需要用到我们的token,也需要去操作咱们的red,另外里边有一些权限的这些东西,所以在里边呢,我们需要有这么几个相关的这个对象进行操作,那这对象给各位我先定出来啊,首先里边第一个对象就是咱们这个token manager。用于token的操作,这咱们之前写到过,里边就是生成token,然后得到里边的具体内容,然后第二个就是我们这个red。
10:00
他们里头。就是red模板,因为咱们要操作RA这个给他引入,然后除了这个之外,还有一个是author manage,针对我们那个权限管理的这么一个工具啊,这是由three security帮我们封装的author。然后这个manager应该是这个啊,咱们把它也是做一个引入,这是针对我们的author管理这么一个工具类。包括单看里边啊,就是相关的这么一些内容啊。就这个啊,然后这个引入之后,还是按照我们之前的方式,因为这些对象咱要使用嘛,所以下面我们就生成它,这个就是有参数的构造,把这些给的就是这进去啊,那里有参数构造过程,我就从我课件中直接复制了啊,因为咱之前写过那些代码就是里边的。这个代码我把它直接拿过来,然后咱们详细来看一下啊。
11:00
在这里边三个参数,第一个选项那个工具类token工具类,还有这个red to,把这三个给它设置进去,然后下面设置两个值,第一个值这个东西。这什么是POS提交,就是仅仅post提交,我们改成POS,然后下面这个过程中啊,是设置你登录的路径,让登录路径的匹配是一个POS提交这路径咱后面会在那个spring security的核心配置类中的配置,我现在先写到这里,这表是设置你的登录那个路径,还有你的提方式,所以现在把这个几个对象我们就注进来了,然后注入之后,然后往下下写,写第一个方法获取表单数据,然后里边进行我们这个相应的一个操作。其实写法跟这个应该说比较类似,那我下面给各位我就详细写一下,就是里边的这么一个方法啊,咱们把它写出来。那我们看怎么做啊,首先我写一下啊。
12:01
咱们的做法就是先获取。表单提交过来,那个数据,也就是你的用户名,还有那个密码,那我们怎么做呢?咱就在里边啊,我们瞄上一个对象,这对象叫object manager。啊,Object manager,然后咱们把它这个相关的依赖,我们给它先引入。Object manager啊,点上里边有一个方法,然后这个方法中呢,有它相的操作,那我们给他写出来啊。好,我们来写啊,Object啊,不是object object map写错了啊,我说看着不对吗?Object map点上一个方法叫这个read。歪了。然后在里边呢,得到你的数据啊,它这个方法中的两个参数,第一个其实理解为可以算是一个流,咱得到一个流就是request,我们看我这参数啊呃,Request。
13:03
点上get input STEM,第二个加上就是你那个类的那个class,或者那个类型的class,我们这里边一会儿咱们给它写一个实体类,我先给它列出来啊,比如一会儿我们就叫user再来一个class,这样的话就可以得到表单数据,然后把数据可以放到一个user的这么一个对象中去,这是里边的这么一个基本的一个结构,然后这个对象呢,这里边我们先把这个就是user这实体类在里边,咱们先创建出来。在里边,我来一个包,就这个叫氨体。Anti里边呢,有咱们相关这个十几类,那十几类我们来看一下啊,我把它就直接分过来了,我这里边写了两个类,一个叫user,一个叫security user,咱先看这个security user是不是实现了user detail,它最终会用一个返回,然后我们的user里边的就是我们的基本内容,就是对应你表里边的相关内容,那我现在把user我们先做个创建,我就这里边我们能使用到啊。
14:12
我们来一个。右侧,然后右侧里边有它的内容。我把这个咱就直接分过来了啊。右侧,然后咱们看一下啊,在里边首先第一个我加了一个注解叫date,用到long book生成它的get set方法,然后下面这些呢,其实都是那个swa里边用于测试的啊,就是这些可以没有,包括你看里边用户名,密码等等,这个写完之后,我在这里边把这user。给它引入啊,注意别导错包啊user,然后它会返回我们那个user的这么一个对象。返回就这么U,所以这样的话呢,咱就可以得到我们这里边表单提交过来的数据,我们用这种方式得到,就是object map,然后点read value,根据它的流把这个内容咱们最终给他就得到了啊,当然这里边有个异常,这异常我们可以给他写一个。
15:13
Try catch啊,给它补合一下这个完成啊,然后完成之后咱们最后给的就是re return我们的内容,而re过程中你看啊,它反一个叫author这么一个对象,所以大家在里边我们加上这个叫author manager。通过它来返回,在这里边呢,有一个方法,就这个奥,在这个奥里边咱们看啊,咱看下这个方法。里边是不是传入这么一个对象叫author,就是它这是一个接口,然后这个接口实现na呢,其实就是我们那个username password author里边有一个token啊,我先写出来,然后咱们也看一下它的源码啊,我先把这写完,这里边我们就new上一个叫做username。Password。
16:01
里边那个token,然后在里边呢,传入咱们需要的那么几个值,这几个值应该都能用到的,第一个就是username,第二个password,第三个英语的权限,我们这里边先给他来一个空的一个权限,后面咱们会有专门的一个授权的过程,第一个就是这个。Username。然后第二个就是它的password,第三个咱就直接new上一个叫a list啊,让它有一个。占位的一个结构。把这个引入,所以这样的话呢,咱们现在把这个方法,我们就做了一个最基本的一个实践啊,当然如果他有异常,咱可以可以他可以直接子肉扭一个就来一个runtime。Exception这个我们就完成了啊,完成之后我们来看一下啊,Username password author token,这是一个类,这类是不是继承了它,然后这里边就是他们相对关系,包括这个类是不是实验了,刚才我们说这个al这个接口啊,这个所以是咱们看到一个结构,在这里边得到表单的数据,然后把它通过spring security就交给spring进行管理。
17:17
所以这是第一个方法,咱们就写完了啊,然后写完之后,下面还有第二个方法,第三个方法,第二个方法就是认证成功你做的事情,第三个方法是认证失败我们做的事情,那下面我们就来具体写一下啊,下面的这么两个方法。那我们看这个该怎么去做啊。首先各位注意啊,在我们的第二个方法中呢,它叫认证成功,然后各位仔细看啊,方法中有很多的参数,其中有一个参数就是这个author这个参数,因为你看啊,我刚才返回的是不是就是这个对象,也就是说啊,现在在spring secret里边,他帮我们做这件事情,当你这过程中认证成功,但他认证成功肯定最终会查我们的数据库,咱写那个user detail给咱一块写,然后认证成功呢,他会去调这个方法,在这个方法中呢,他会把你认证之后那个内容给你传过来,那怎么传过来,就通过这个参数传过来你认证之后的那个内容,然后在这里边呢,它有一个方法。
18:25
给各位写一下啊,这个方法它叫做盖头。这个方法,这个方法得到就你认证之后那个用户的一些信息,咱需要把这信息给他得到,然后得到之后根据用户名生成token,包括再给它放到write中,然后做个返回,所以咱们现在需要有这么一个东西,然后这些过程中呢,因为咱要返回对象,它默认的这个对象是个object,所以咱们自己写个实体类。对它做一个封装,那十几类呢,我就从课件中复制出来。比如用这个是一类叫security user,因为它是一个user detail这么一个东西。
19:06
把这个啊,我先拿过来。然后把这代码给各位复制过来。就是我们的这个代码啊,咱先写出来,然后咱们详细看一下啊,这个代码是什么特点,这实体类我就不再敲一遍了啊,因为是一个基本的一个结构啊。我先把依赖给它先引入进来。当然这个工具中呢,你可以用那个自动导包啊,我这里边就一个去导,让各位看的就是更清晰一点啊。就是里边这些内容啊,我把这包我们先给它。导进去啊。就这些啊,然后咱们看一下这个是一类啊,我们叫user,它反而是user detail,因为咱们在认证过程中,它会调用我们写这个user detail service,去查数据库是不是返回你认证之后那个用户信息,所以在这过程中,咱让他最终就返回这个东西,你继承了实现了user detail,然后在里边有这么几个对象,第一个咱刚才写那个。
20:11
User啊,就是这个user对象,然后在里边呢,还有这个就是当前的权限列表,就你用户有哪些权限列表,这里边都列出来了,包括这些基本方法,所以咱们现在在里边来做这个事情。我这里写下啊,首先第一部分我们认证成功之后,这里边先得到,你认证成功之后,那个用户的信息通过这个得到,然后这里边返回的就是我们这个user,因为里边有项内容再用它。就是得到这个内容,因为它实现了user details这么一个接口,这个我起个名字,我就叫这个user啊,咱们把它的依赖引入这位置,需要给他做一个。
21:00
相转。给他。强调一下啊,这就得到了啊语认证成功之后,通过这个参数就传过来你这个用户信息,然后这个得到之后,咱下面做什么事情呢。大家想我们要做什么?咱说过认证成功之后,我们做什么事情?干什么?第一个是不是要生成token,就是根据用户名生成token,然后第二个把你那个信息,就是把这个用户的名称和啊,名称和用户的权限列表信息放到是不是ready里面去啊,所以咱下面要做这两件事情。包括这个图咱看一下啊,之前给大家画过一个基本的一个流程图,我把流程图打开,咱再来做一个说明。就是我们的这个图,这里大家看啊,认证成功之后,首先把你的数据是不是要放到write中去啊,Key是用户名,Y6是全列表,然后咱们要生成token,把这个放到会议中去,然后通过hier做这个处理,所以现在我们做的其实就是第一步已经完成了,然后做第二步和第三步啊,但是第一步中还有一个user details service,这咱一块来写,咱先把这个完成,首先生成这个token token呢,咱们有一个工具类,刚才已经引入进来的这个东西,包括在这工具类中,咱们写的方法中有一个方法叫可token,根据用户名得到,那我来得到用户名里边一个方法叫get current user info,当前的用户信息里边有一个用户名,这个就可以生成一个token的字符串,这个做到了啊,然后做到之后。
22:50
下面干什么呢?把token是不是要放到red里边去,那咱来放下啊。red to里有一个叫OPS four y6,然后在里边有个方法,这方法很简单,就叫S,根据K。
23:07
还有它的value,第一个key是咱的用户名称啊,就是这个,我把这个拿回来,然后Y是它的权限列表,咱们在右侧里边有我们这个权限列表,就这个啊,Get那个。Permission value list就是咱们这里边写的这个。集合当前的券列表,所以这行代码就是把数据放到了我们的writing里面去,然后放完之后,最后我们可以做一个返回啊,就response,就提示它成功,并且把ton it返回来,Out,加上里面这个叫response。然后加上一个R点这个啊OK啊r.OK这个。点上一个date里边加上你的这个内容,它的K,我们是token value就是我们的Tony字符串,咱们把token直接给他做这么一个返回。
24:06
我这里加个注释啊。返回to片,所以这样的话,咱们把认证成功之后做的事情就完成了,这过程给各位再重一遍啊,首先第一个咱们在这个方法中,因为你做认证首先会调这方法,先得到表单过来数据,然后把数据给他返回,这过程中它会调我们一会写那个user detail service去查数据库,包括返回用户信息,如果这种成功,它会调这个successful方法,在这个方法中,这个参数就是传过来你的一个认证之后,用户信息咱把它得到,然后根据用户名是token,把数据放到re中,最终把token做一个返回,所以这个我们就完成了,完成之后最后一个方法,那就是我们这个认证失败,认证失败呢,比如现在我就直接给他返回一个错误的提示啊,直接给他做个返回就可以了。
25:03
这里边我加上一个叫。挨着返回,这样的话,咱们就完成了我们这个认证的过滤器的一个编写,里边就是这个过程,那我把这过程给各位截到我这个笔记中来,各位知道这个过程的一个写法啊。首先第一部分咱们就是写个类继承这个user password author the theater,然后里边传输已知参数,传完参数之后,第一部分先获取表单的用密码,包括这个过程,刚才我们就是一行一行给它应该写出来了啊,我把这个代码给各位先。接过来。就是我们的。正确代码啊,我调的稍微小点啊,就是这么大啊,这是我们的第一个获取用户名和密码的这么一个方法,然后这个做到之后,下面咱给他认证,认证之后呢,首先如果说咱们认证成功之后,它会调里边的这个方法,我把这个方法给各位复制过来,这就表示认证成功之后我们要调用的。
26:12
这么一个方法啊,就是里边的。这个方法。我把它稍微调整一下啊,然后这是认证成功,认证成功之后,咱们得到传过来的认证之后那个数据,并且生成token放到re里面去,这里边我都写到了,然后做到之后下面就是认证失败,认证失败呢,咱就直接给他返回一个错误提示就可以了。就是这个代码啊。所以这样的话呢,咱就把这个认证的过滤器,我们就最终完成了,各位知道这个编写的过程,通过这个过程咱也能够更好理解spring里边一个基本的执行流程,所以咱们就完成了啊,然后一会儿咱再写那个授权的过滤器。
我来说两句