00:01
各位大家好,我们继续来学习spring security,刚才内容中呢,我们把common里边的工具类完成了编写,也就是在里边的service base中的工具类咱们给它编写出来了,那我们下面开始编写我们这里边的最核心部分,Spring里边的核心内容,那这个里边的我们要写什么呢?咱们先看一下我的文档,里边给各位列出了一个基本结构,这结构我强调在我们的实际开发中,各位写的不一定按照我的结构来写,但是里边这些事情肯定我们都需要做到,那里边有什么,我们来看一下啊,首先这里边我们一个来写,咱先写下面的这个部分。就这里。在这里边其实写的都是我们针对认证授权中一些相关的处理器,或者说一些相关的工具类,所以咱们先把这部分完成一个编写,也就是里边的对应的我们的第二步。
01:09
编写这个。死不认C里边进行认证授权的一些工具类,还有他等。处理器,也就是咱们刚才看到的里边的这部分。那咱们做编写,那编写要怎么做,咱们一个来看一下,我先给各位做一个总体上的介绍,然后咱们进行详细的编写,那咱看一下啊,在这里边呢,首先它的第一个叫default password e coded是做密码处理,就是这个我们可以补写,就是用它本身带的那个password e coded,当然用它之后我们想做个处理,想对咱的密码做一个MD5的加密,你不加密用它本身的方式也可以做到。然后第二个是一个处理器叫token logout,比如我们现在做退出之后只用这个处理器,还有一个叫token manager,用JWT,剩一个token,另外就是一个叫an author。
02:13
当你没有授权的时候,做一个统一的处理,所以咱们下面就来编写里边的这么几个工具类,还有它的处理器,咱们一个一个来写一下,首先我们写一下2.1第一个。就是做这个密码的处理的这么一个。攻击类,那咱们看怎么来做,我们现在就来到咱的代码中,在里边呢,我把这个包咱们先做个创建。com.at硅谷。点上这个叫。咱们建个包,然后在这里边呢,我们可以创建多个包,比咱按照我这个结构来创建,比如说咱们来一个security这个包,包括有一个config filter等等,我把这个先给它创建出来。
03:09
比如现在我先来一个config。这个班。然后在里边呢,它还有一个叫security,我把这包做个创建啊。Com点。At硅谷点上。点上,比如说还叫这个了啊。这个。我们做个创建,然后在这个里边就完成咱们刚才写的那几个工具类和处理器,咱首先点第一个就是密码的一个工具类,那这个我起个名字,我就叫这个default。Default,然后叫password。乙等。这么一个工具类,然后写完之后呢,咱要怎么来写这个代码呢?各位注意,咱之前曾经说一个接口叫password eod,它是做密码加密,所以我现在让这个类就来实现这个接口叫做password。
04:18
已扣的。咱来实现一下这个接口,把依赖引入,然后实现接口里边的方法,这接口中主要就是这么几个方法,包括咱可以看一下它的源码中,首先你看第一个,以后的就做你加密,然后一个叫match。这是什么?是做一个比较或者一个比对,比如现在我输入数据跟你加密数据,要做个比对,另外一个默认的方法返回就是false,所以咱们现在实现里边的这两个方法,咱们用MD5对它做加密,那再来写一下啊,首先在里边我们先写第一个,咱先生成它那个就是。午餐的一个构造。
05:02
然后在无参构造中呢,比如我就直接啊来一个Z负一啊,给它直接调用里边这么一个结构啊,做一个最基本的一个调用,这是一个就是午餐的构造这么一个方法。好,这个写完之后呢,我们再写一下它这个有参数的构造,把这个我们写一下就是public,然后有三构造中我加个int,其实就是它那个长度啊,咱来一个。Str。这个这是一个参数啊,然后这是它的一个有参数的构造,所以现在我们写了两个基本方法,主要其实在下面啊,下面咱看第一个叫已扣的,在这个方法中咱要做什么呢?我们要对这个就是字符串和这个数据进行一个MD5的这么一个加密,那怎么写给各位写一下啊,首先第一个咱们在service base里边呢,之前曾经有一个工具类。
06:10
就是这个MD5,所以咱要用到它做一个加密,那这个怎么写,给各位写一下啊,在这里边我们就直接用这个MD5。啊,MD5这个工具类中的方法,你看这个我已经引入了com.u呃,U啊写两个了啊,就是它了啊,然后这里边这个方法。我们这里边传入,你加密那个字符串,咱就把里边的这个字符串传进来,加上一个叫。这个凸词缀,这样的话可以做个加密,加密之后咱把它最终做一个对退,就是对密码做个处理,这是我们自己写一个已扣的这么一个方法。这个啊,各位给的知道。
07:02
然后这个写完之后,咱们往下来做这个方法,这个方法做的是什么呢?它就对我们这个密码做一个比对,就是进行密码的一个。比对,比如我密码进行加密,然后我输入一个密码,看两个密码是否一样,但你注意你输入的密码是不是要加密之后再跟你的密码做个比较,因为咱存储的密码肯定都是加密之后那种,而这里边大家看两个参数,第一个参数你列为就是你加密之后那个密码,然后第二个是你传入密码,你需要把密码做个加密,然后做个处理。那咱们来看一下啊,里面这个结构,那这边我来一个比between。然后这里边啊,比如说呃,我这么写啊,我这个改个名字叫这个。呃,已code的enco已扣的这个password吧,这个这是加密的,这不加密的啊,然后让他做一个比较。
08:03
点上这个叫equals,然后在里边还是上面那个代码MD5点上这个方法我们加上。这个差点上。兔死追。啊突词缀,这样的话就让他们做一个比较,看它们是否一样,如果一样的话,返回处不一样的话,那就返回false,所以现在我们对这个就是。密码的一个处理,咱就给他完成了,我们自己写的一个类,让他实验这个接口,然后接口中把这个给他做到,这是我们做一个编写,然后里边核心的应该就是在这位置,我把核心部分给各位解到里边去啊,包括这个类我们后面要加载,虽然给它加一个content,交给这个spring进行管理。这个咱接过来啊,密码处理的工具类。
09:00
然后里边的具体代码,我就把核心部分给各位。Program。主要是在。这里。这个啊,我们就做了一个最基本的一个编写密码工具类。所以咱们完成了各位按照结构应该能给他快速做到,这应该没有什么难点啊,主要就是一个过程上的东西,然后这个写完之后咱往下做,下面呢,我们写什么呢?咱再来写另外一个工具类,就是这是针对token操作工具类。那这里边我们要写什么呢?比如说咱们之前讲过,我们做这个认证授权一个基本思路,咱思路中是不是要根据用户名生成一个token,然后这个token要放到cookie里面去,是不是有这么一些过程,所以咱们现在这个token manager写的事情就是生成token这么一个过程,包括根据用户名得到你的token,以及根据token得到用户名,就是相关的这个操作,那咱来写一下我们的这个内容。
10:04
我想这个位置啊,就是。2.2。Token。操作的工具类,这工具类咱后面肯定要用到的,所以咱给他详细来写一下。那这token怎么生成的,给各位说明啊,咱要使用到。这么一个东西叫JWT来生成我们的token j wt是什么呢?它是按照一定规则生成一个字符串,这规则由GFT帮咱们规定好了,包括各位看一下我文档中,然后这规则里边呢,它给我们包含三部分,大家看啊,第一部分就是它的头这部分。也就里边的这个头信息,第二部分是叫有效载荷,或者说主体里边可以包含咱的用户信息,然后第三部分叫签名,哈希理解为就是它一种防伪标志,按照什么方式进行编码,然后给它变成什么格式,最终生成的就是咱们看到的。
11:06
这种效果它里边有三部分,头主体和纤维哈希,每部分用个点隔开,所以咱用它来生成,这里边用这个JWT生成,而GWT呢,你在使用过程中,里边需要引入一个依赖,就这个依赖,这之前咱都复制过来了,用它生成我们这个token,那我现在把这token给各位生成一下。咱在里边做个编写。那我们写一下啊,首先里边我就创建一个类,这个类我就叫token。Manager,然后把它也是交给spring并管理,然后在里边呢,我们首先写第一个方法。根据用户名。生成token,然后写完之后我们再写第二个方法,根据token的字符串得到里边那个用户的信息,因为咱跟用名是用token token是一长串字符串,而咱拿到字符串也能得到里边的用户信息,这个是咱们这么一个两个方法,然后洗完之后,因为这token呢一种机制。
12:20
咱可以设置一下就是token的。一个叫做有效时长,比如设置token在一分钟之内有效,在多长时间内有效,这里边我可以设置,那里边比如我写一个纸。我就来一个private,我加一个了。然后里边我来一个token。就是它一个有效时间。PI啊,有效时间。呃,Rat吧,然后等于比如说我们就写上这么一个值啊,就24乘以60。然后乘以60,再乘以1000,因为它是以毫密单位,咱做一个有效时长,另外我们可以对这个就是做一个基本的一个加密,就是你有一个加密,或者说编码的一个密钥,当然这个密钥呢,在实际的项目中,咱们要自己来生成一个字符串,我这里边为了方便,我就直接写一个123456了啊,用这个密钥我们做一个生成就来一个就是。
13:29
123456,这是咱们编码的一个密钥,所以现在写了两个基本的常量,为了后面我们操作。这个做到之后,下面咱们先写第一个方法,我来一个public。String这个方法咱就生成一个token。我叫做create token。然后在方法中咱们传入用户名,因为咱要根据用户名生成吧,我来一个string,就是name,那下面咱就写下这个具体代码,代码应该说比较固定,给各位详细来写一下啊,Token。
14:08
那怎么做,首先第一个咱用到一个对象叫JWTS。这是由GFT中给我们封装的,里边一个方法叫build。大家看。Build什么意思,是不是有构建意思,然后首先咱做第一部分set,一个叫subject,里边传入我们的右侧name,就给它设置里边那个具体内容,或者它的主体部分。这是一个,然后设置之后,里边我们可以设置它那个有效时长,有这一个方法,有效时间把咱们刚才那个时间给他就传过来,这是设置它的有效市场。当然这个时长呢,我们设置的时候里边啊,你直接传它不对,咱就要给他扭上这么一个叫。
15:00
Date,然后date里边呢,我们加上它的时间,因为大家注意这个时间呢,比如说我现在生成是不是要过去这么多时间之后才失效,那咱做法就是我先得到当前时间那个毫秒数。咱来得到一下啊,System有一个叫current。Time minutes,然后加上咱们这个token这个值,这是设置它那个就是过期时间,然后设置之后再设置它那个密钥,我们进行一个编码,还有里边的一个加密。那我们来写一下啊,这个s with里边加上有一个方法,就是它那个加密和编码的一种方式,那这个我就从课件中给各位就直接复制过来了啊,就是关于那个JWT工具类中的一部分,也就是里边的。这个部分。给各位,我就直接付过来。这是它加密中固定的一种解法。
16:03
把里边需要的依赖咱给它引入进来。这样的话,咱把这个生成token的这个代码就完成了,然后最终咱们做一个re return token,它就可以根据用户名生成我们的token的字符串,通过JWT来生成。我写个注释啊使用。这T根据用户名使token这个完成了啊,然后完成之后我们再写下一个方法,根据token得到里边的用户信息,就是把里面的用户名。包括他的用户信息给他得到。那咱们写这个方法啊,我来一个。Public。比如我叫get这个。忧色。呃,Info,然后这个from。Token就是从token里边得到用户信息,然后它的参数呢,咱们传入这么一个token的字符串。
17:11
Token在里边,我们写这个具体代码,那我们写一下啊,它还是用DWTS里面这个方法有一个叫pass。Pass什么意思,是不是有解析意思啊,然后咱们需要set里边这个就是它那个密钥,因为咱密钥是自己写的嘛,所以把密钥需要用它做编码,用它做解码,然后这个写完之后,我们调一个方法叫这个pass c g wts里边就传入这个。Token的字母串,这样的话就可以解析,解析之后咱从过里边一个叫get body,点上get subject就得到里边那个用户的信息,比如我们叫user info,最终咱们做一个。
18:06
User info这样的话就完成了,然后大家看代码中啊,这是不是set进去的,这是就get出来了,这是根据用户名是成ton,这是根据token得到里边的用户信息,所以咱们把这个就写完了,然后写完之后呢,就是这个过程中啊,按照咱们操作流程,应该还有一个方法,这个方法就是删除这个token,比如说咱们也可以来一个方法public with,我教这个remove。Token里边传入你那个token的字符串,当然这个删除方法其实不需要我们写,因为你这个token嘛,其实不需要咱们删,我客户端不携带token是不是可以了,但是方法给他也列到这里,大家知道他肯定有这过程。用户名创建token,根据token得到用户名,然后删除token,所以现在把这个工具类给各位,就做了一个编写关于这个token的这么一个工具类,大家把这个能给他,就是知道里边的过程代码不需要你去完整写遍,但你知道里面的含义,我这里边为了给各位演示清楚,我是从零开始,一行一行给各位写出来的。
19:22
所以这个咱们就完成了。关于它的这个工具类。好,我把里边核心部分给各位就截下了啊,主要就是这两个。生成token得到用户的信息,所以咱们把它就完成了啊,这是我们写的第二个工具类。给各位寄过来啊。然后这个完之后,咱们下面继续往下来看啊,咱们把这个写完之后,下面我们写第三个是一个处理器,就是你退出处理器,比如现在我认证之后也做了访问,咱是不是可以做一个退出,而我退出之后里边肯定要做一些处理,所以咱们下面就写这个退出的一个处理器。
20:14
那我写到这个位置啊,给各位也是做一个分析,然后咱们从零开始编写这个代码。我写到这里啊,就是。2.3。退出的处理系,那大家可以考虑一下啊,你说这个退出咱要做什么事情。退出,我要做什么?其实我觉得应该很明确啊,因为咱之前说的我们这个token是不是通过每次发送请求的hier传过来的,所以咱第一个把token是不是要给它删除掉,然后第二个咱这个信息是不是放到了我们的red里边去啊,所以咱们根据token得到用户名,根据用户名从red中把这信息给他删掉,这就可以了,就一个删除token,一个从ready里边删除掉这个头根信息,所以咱们要做的肯定就是这个事情。
21:14
那代码我在里边给各位,还是继续来写一下啊,咱们写下这个代码。我在里边这个类,这个类我就叫token。Log out,这个handler。因为它是一个处理器,然后让它呢实现一个接口,这接口叫做log out。啊,Logout这个handler。实现这么一接口,然后这个接口我们来看一下啊,它是由spring security里边提供的一个接口,接口中就是针对你退出这么一个方法,所以咱们下面就实现这个方法,在里边完成咱们的具体过程。
22:01
咱们来做实验。而这过程中要怎么写,给各位来写一下啊。大家注意,首先第一个啊,咱这过程中呢,我们是不是要移除这个token,所以我在里边呢,我就把那个token的工具类咱给它先。拿过来这是第一个,然后除了他之外呢,这里边呢,还需要做件事情,是不是针对我们那个一个操作呀,所以咱里边把那个red。Complete就是red模板给它也是拿过来,因为把这两参数我们肯定都需要,然后需要之后,咱现在我们怎么做呢?后面咱们再调这个类的方法的时候呢,咱其实有多种方式,这里边有一种比较,就是普通的方式。大家想这可以怎么传过来,这两个参数或者两个对象可以怎么做一种最简的方式,我写它这个有参的构造是不是能传过来,那我们现在那就这么来做啊,通过他的。
23:04
有三构造串量参数,一个是token manager。还有一个是这个。To在里边我们写一个this给它,直接。赋值就可以了啊,还有一个是这个radi table,给它直接做个赋值,这样的话把这个参数就串进来了,然后传进来之后,在下面我们写下这个具体逻辑给各位分析一下啊,首先第一个咱的token每次是不是要放到he特中哦,所以第一步呢,咱们先从这个。嗨,到里边。是不是要获取到你的token?这各位应该能想到,咱之前分析过啊,你前获取到,然后会到之后咱做个判断,如果这个值不等空,那怎么做啊,就是这个token。不为空。
24:00
那我们做的第一件事情就是先给他移除。Token移出之后,再从这个red里边。是不是删除这个token,但是这token呢,它是一个就是编码之后那种,咱要得到那个用户名,根据用户名ready中的key进行删除,咱之前讲到过ready中的K存的是用户名value是权限列表,所以要得到它那个K把它删掉,那咱下面把这个我们来写一下啊。再写代码,首先第一个里边有一个request,我把名字改一下啊。就叫放在咱们写。request.get head是不是头,然后这个头我们叫token,就是得到它那个token的这个字符串,然后后面设置名字叫token,然后得到之后下面做一个判断。判断一下啊,就是如果说这个token。
25:03
它不等于,那那咱怎么做,是不是给它先移除啊,移除就这移除啊,咱之前那方法为空,咱为了有这过程给他也写下,就这不需要移除,你每次就是把它直接不传递就可以了,咱现在给他就移除一下啊,点人家这个逻辑,然后下面我们从token里边获取用户名,用咱们刚才那个方法,Token manager里边这个叫盖头。User info。传入。他就得到我们那个用户信息,就咱这个用户名。我们叫username啊这个名字,然后得到之后,咱下面就从read里边把它移除掉,咱们调read time中一个方法叫这个delete里边传入它那个T就是用户名,这样的话就完成移除,完成移除之后,最后咱可以给他返回一些信息,咱用我们刚才写那个工具类。
26:08
Response u里边的out,然后加上这个就是呃,这个啊,Response。后面加的应该是一个R对象啊,咱用这个R点。这个OK啊,把它直接加进去,这样的话我们就完成了这个退出的这么一个处理器的编写,里边就是移除token,从write里边把它删除掉,最终做一个返回,这个我们就写完了啊,关于这个。退出的处理器。所以各位把这个能给他做到。然后我把这个核心代码给各位,也是截到我的笔记中来,各位看我的笔记应该能把这过程给大家做到。就这个啊,就是我们这个类的继承关系。
27:01
然后下面是咱们的。核心。代码部分。就是这个位置。给各位拿过来。呃,这个啊,调的稍微大一点啊。啊,这样啊,所以这样的话呢,咱现在把这个第三个工具类就完成了一个编写,所以各位按照我这个编写过程,能把这些给它快速做到,然后做到之后里边还缺少一个就是未授权处理类,这咱们一会儿来编写,现在咱完成了三个,一个是密码处理工具类,一个是token工具类,还有一个是退出的处理器,这个我们先演示到这里。
我来说两句