00:00
接下来继续完成。我们这个后端API的这个项目。所剩的一些功能,而且是比较重要的一个功能。就是权限管理。看一下我们的路由。哎,我们有这么多路由。啊,不是说每个人都可以去啊,使用这些路由的,比如有人就只能去管理用户啊,有人是只能是负责商品这一块是吧,有人可以去处理订单这一块。所以说我们要对我们的功能。然后做一些这个权限的限制,让啊不同的人拥有不同的操作权限。是不是,那我们怎么做,是不是要给这个不同的人去分配这个权限。啊。当然我们想个问题,如果比如说今天新来的一个员工,让他管订单,我们要把这个订单所有相关的权限,然后再一个一个的给他分配一下,是不是比较麻烦?啊。啊,那比如说又来了一个人啊,他是管理这个商品的,我们要又把订单这个,把商品相关的权限又给这个人分了一遍。
01:04
对吧,这我们的功能比较少,就这几个路由啊,所以你分起来还好,但是你功能比较多的情况下呢,比如商品的话,你比较多的话啊。你分配起来就会非常的麻烦,所以我们能不能想一个办法?想一个办法就是说啊,我们把。相应的一类的权限啊,放到一个组里面。比如把所有商品啊,这个管理相关的一些啊路由放在一个组里面,我们称为是啊商品管理员。可以吧,然后这样的话来了一个人,我们我们只需要让这个人来说你就是商品管理员,然后把这个商品管理员权限给他就可以了,是不是。啊,那这个中间的这个我们称为什么呢?就是存放了所有的这个商品的这个权限呢,这个东西我们称为什么呢?称为。啊,这个权限组也可以被称为角色。清楚吗?好。那这个就是我们的一个一个的基础的一些权限,是不是用户就是用户,哎这样的话,也就是说用户他具备某些角色,而角色呢,又拥有一定的权限。
02:05
是不是他们之间啊,会进行两两的一个关联。你看用户和角色或者路由组之间的一个关联,然后这个角色和这个啊,这个权限之间一些关联,是不是这就是其实这经典的RBAC啊,权限管理模型,我们来看一看一个图啊,这就是我们的RBAC啊。我没有基础的权限表,我们可以把我们的这些功能一个一个的去录成一个一个的权限,然后呢,呃,把这些不同的权限给不同的角色,比如说订单管理员,商品管理员,是不是比如说系统管理员。啊,还要处理这个物流的物流管理员啊,不同的角色拥有不同的这个权限,他们通过一张关联表去进行关联好我们这个角色定义好之后,就可以去给不同的人去分配不同的角色,比如小明你是商品管理员啊,小兰是订单管理员。啊,这样的话,他们每个人就间接的去拥有了对应的一些权限,啊,这就是RBC。
03:01
啊,那我们如果要去设计这个RPC,你要去建这么五张表,然后去写我们相应的功能,对吧,但是你要是从头开始去写是比较麻烦的。我们PP给我们提供了,就是我们提供大量的可用的一些组件啊。我们来使用个什么组件来看看。使用一个呃,Lover。Gun。Permission。啊,这个。使用这个权限管理组件。他对这个6.0以上支持都是比较好的。啊,然后。安装。直接复制,我先让他装着,接着我们再来说这个东西。在虚拟机里面,我们的项目目录下。我加上这个composer啊memory,因为我的这个虚拟机它内存比较小。他经常会报这个comp内存不足的一个问题。
04:07
里米等于负一啊,如果你们的虚拟机比较足的话,内存比较足,你就直接用这个就可以了,直接用这个命令就行。回撤下来下载的,接下来看一看它的这个官方文档,这是它的官方文档。啊,我们所有用到的一些啊。功能啊,一些这个类一些方法都在这里面可以找到啊,如果你感觉这个英文读起来有困难。啊,这里有别人基于这个官方文档的一个翻译清楚吧。只有一个翻译的一个文档啊,如果你感觉这个太多啊。这边还有一篇,就是简单的一个教程。啊,那我们来就看着这个一个简单的教程来给大家说一下啊,首先他介绍了什么是这个用户和角色啊,比如我们经常使用的一个论坛,哎,站长是拥有最高的权限,管理员只对这个文章有一些管理权限,是吧?你看VIP对资源有一定的下载权限,普通用户只能对自己的文章增产改查,是不是还要对别人进行评论,而游客什么都做不了,只能去看。
05:08
哎,这就是不同的角色,他拥有的不同的一个权限。啊。那么我们怎么通过表的关系来去啊,描述这个用户和权限之间的一些关系呢?啊,就是这么几张表啊,它省略了一个啊用户表啊,也就是一个user表,我们你就想象一下这里假如有一个用户表啊。啊,这有用表,接下我们来看一看。首先最基础的你一定去看权限啊,权限是最最基础最小的一个单位啊,就是我们一个权限啊,一个权限的名字好。啊。接着是角色对吧,比如说管理员,然后订单管理员,商品管理员,不同的角色。角色会和这个权限有一个关联,这是他们之间的一个关联表,你看就是。啊。Ruler has permission对吧,这个关联没有。然后就是什么呢。
06:00
我们这边会有一个用户啊,用户表。对吧,用户表我们最终是要把权限分给用户的,是不是,所以这有一个用户表,那用户我们既然把角色分配给用户,用户和角色之间是不是有个关联表,就是这个表model has ruler啊,这个model就是模型,我们的这个用户模型啊,模型具有的一个角色啊。就是和角色性关联这张关联表啊。它比我们之前看的这个传统的这种RBAC5张表呢,多了一个表,是不是多了一个这个model汉子啊promision,也就是说呃,我们的这个组件是可以对用户啊,直接去分配这个权限的,但是。啊,还是刚才我们一开始说的那个意思啊,你直接去分配的话,一个是比较多,一个是比较麻烦,所以不建议去使用这个方式,但是它为什么提供这个功能。是因为嗯,你有时候作为额外的一种情况下,比如额外要给一些用户去添加一两个权限的话,是可以去使用这个方式的,清楚吗?啊,我们这个举一个例子,哎,比如说啊,有一个人啊,小明他是财务主管。
07:03
是不是他能管理这个财务这个部所有相关的一些事情啊。但是。嗯。我们现在这个给大家分配一个什么权限呢,是让他说,哎,以后这个公司的大门也归你管了。对吧,那我没必要再去建一个角色,好大门管理员,然后再把权限分一分,再让他具备这个大门管理权限,没必要吧,啊,可能就只需要一个,呃,大门的一个权限,那我们直接就临时给他,不是说临时就就说直接给这个用户加一个,就是说来负责这个大门的一个权限就可以了。对吧,啊,这时候偶偶尔就是作为这个权限的一个补充,这个是可以用的啊,其实大部分情况下,我们基于这个角色权限,还有用户和角色就可以完成我们的权限管理。清楚吗?好。这里安装完成了,我接着看文档。接下来他介绍了这几个表啊,这是基本的一个角色信息,然后基本的权限信息,然后是模型对应的角色啊,就是我们的用户模型对应的这个角色的一个关联表,接着是角色和权限的一个关联表。
08:05
对吧,然后是这个就是用户具有的一些单个的一些权限。好,看一下他们的关联关系,权限和角色,一个权限可以可以被多个角色使用,一个角色也可以有多个权限,是一个多对多的关系,对不对?好,那用户和权限,一个用户可以有多个权限,是不是权限也可以被多个用户使用,所以他们也是多一多啊,这个这个他写错了啊,包括这个用户和角色也是一样的啊。你用户可以有多个角色吧,你角色也可以被多个用户给使用嘛,啊都是多利多这些。啊。啊,接下来这个组件啊。安装扩展包,我们安装完了,然后执行这个命令生成啊数据库的迁移文件,对吧?它我们要是设计这个权限管理是需要这些表的,你可以看一看,我们数据库并没有这些表,你来看一下。是不是并没有这些表?对不对,你总不直接去手动创建吧,人家这个扩展已经给我们写好了啊,这个签邮文件,所以我们只要执行命令去创建权限的一个签邮念就可以了啊,来执行一下。
09:03
在这啊。嗯。在我粘贴的时候,他多了很多这个中文啊。我们先随便找一个地方粘贴啊。在这吧。啊,不是复制的有问题啊。这里复制一下啊。先放这儿看看对不对,看多了一些这个中文啊。就是把中文给删掉,然后只留这一句话啊,只留这一句话。啊,我是临时在这儿,就是处理一下这个文字啊。啊,接着粘贴过来。发布那个配置。发布这个迁移文件啊,不是配置。之后这里database这里,纽瑞这里会给我们生成,你看权限的一个迁移表,是不是它这里面不是迁移的一个表,你看它是创建了很多表,比如说创建了这个权限表,创建了角色表,然后呃,模型和这个权限之间的关联表。
10:00
啊,用户模型和角色之间的关联表,接着是角色和权限的关联表,这他这是创建了很多,只不过他是放到了一个迁移文件里面,清楚吧啊。接下来我们去啊运行迁移就可以生成相关的这些表。来运行。签约完成啊,刷新一下数据库。啊,刷新一下。你会发现多了一些权限相关的表,是不是?你看权限,然后这个角色。啊,这个。模型和权限的关联。模型和角色的关联,是不是接下来啊。接着往下看。啊,生成这个配置信息,配置信息呢。我们生成完之后。他会给我们。在这个卡菲克下生成这个配置信息啊。我们来执行一下。啊,生命完成,看一看康菲格。多了一个pro的配置信息,这里面可以配置我们啊,这个models使用的一些表啊,然后包括你用的这个table的一些名字。
11:09
啊,包括你这个。字段的一个名字,其实默认的就可以啊,默认的我们去用包括缓存的一些设置。啊,基本上这个权限我们不用管它。除非你的表和我们这些标准的,这个不是标准和我们的表不一样,字段不一样,什么不一样的,你再去调这个配置文件就可以了啊。啊,嗯。我们还要对这个user模型进行一些调整。就是。他的这个我们这个权限管理啊,都是对这个模型,对用户啊,对这个用户的模型进行操作的,所以说啊,我们可以在这个用户模型里面去使用权限。就是他提供的这个这个包提供的这些treat就可以使用他的很多方法啊,去操作这个权限啊,接着去修改一下用户的模型。啊,这里没用老师先折叠起来找一下APP model。
12:01
哎,有。啊。直接在这下面啊。去柚子它就可以了。当然他没有,是不是没有的话,Has。入我们手打手打回撤,它会自动为我们引入这个命名空间啊。好,这样就行了啊。接着往下看。这个用户我们就不创建了,我们是有用户的啊,包括这个。啊,这个权限啊,权限,我们要创建一些权限。对吧。啊,包括怎么使用,比如为用户添加权限,使用这个user模型,然后使用这个方法去给用户添加权限,我们为什么能使用这个方法,是因为这里我们用了他的treat,是不是用了权限相关的一些treat。然后是为用户添加角色啊,添加多个角色,然后。我们先把它方法过一遍啊,等会再去写例子啊。等会就不是写例子了,就直接去写我们的项目,然后给用户去啊,删除权限,添加权限,给角色添加权限。
13:08
对吧,这个我们肯定是着的,然后为角色。这个添加权限。啊。这个他这个他应该是写重了啊。获取用户的这个所有的一个角色,然后呃,就是同步权限,然后角色中删除权限。然后获取用户的一个所有的一个权限,对吧。这是我们所有的一个添加的一个操作啊。接着看看我们验证啊,验证呢,使用这个。它啊,可以验证具不具备某个权限,还可以使用can。然后比如说检查用户有没有某些角色可以用head ruler啊,或者使用这个方法都可以啊。啊,或者说通过ID去判断是否具有某个权限啊,或者拥有某一组权限,其实他这个判断方法很多,但我们用的可能就比较少一些啊。
14:03
可能用他们中间的几个就可以了,接着是一个模板的一个使用,在模板中的使用。我们是API的项目,所以模板中不会用,模板中的话,它提供了一些指令,可以让我们去呃快捷的去验证这个权限,比如说什么样权限可以显示什么。好。数据填充啊。这个数据填充。权限啊,一般我们都是在写完项目,就是说项目上线之前,也是写好填充文件,直接执行数据迁移的时候,把这个数据留给填充上,而不是说在项目部署上线之后再手动一个录啊,当然我们会提供权限录入接口,因为我们还会新增一些其他的功能是不是?但原始的一些权限,我们还是要去进行数据填充的好。这个是啊,增加所有的为角色增加所有的权限。诶,这个简单的教程就完了啊。那我们就直接去。
15:03
写我们的项目啊。来这个配置完了,我们创建一个迁移文件啊,就是填充文件,把我们的所有的权限给填充填充进去啊。填充进去。PP make。Car。和迷信。啊,是这么写的吧。是的。很明显。谁打。创建一个千牛念。找到啊。千有念。好,在这里去写我们的权限的一个迁移。
16:07
嗯,接着看一看,我们所说在这个里面是干什么呢?去添加基础权限啊。录入添加权限。啊,接着是干什么呢?添加角色,然后为角色。添加权限啊,就是我们要做验证的一个事情。创建就把所有的权限给迁到数据库里面,接着呢,我们创建一个默认的一个超级管理员的一个角色,然后给这个角色分配一些权限。这样在我们执行迁移的时候,我们就有一个可用的一个管理员的一个账号啊,不用你再手动去注册去分配权限好。添加权限,它使用的是这个方式啊,一个一个的create啊,一个一个。来,我们使用什么呢?我们定义一个数组。
17:05
等于。定义一个二维数组。在这里面我们去写权限啊。可以看一看我们的权限表都有什么字段。是不是有ID有内幕?嗯,还有这个。对不对。知道吧,好。呃,接着看看这个角色表都是什么?也是一样的啊,有这个ID,有name,还有这个守卫,也就是看守机的一个名字,因为它的权限可以基于这个多个看守机去使用的,比如说这个。API或者web,而默认它使用的是web啊。嗯。我们现在少了一些东西。就是他这只有一个name,我们验证权限是基于name的,所以name是唯一的。
18:04
然后是一个看守信,没有我们中文的一个名字,所以展示出来的时候,看的时候不是很友好。啊,所以我们去改一下他的迁移文件。讲一下这个迁移文件啊。增加两个中文的这个字段。先回滚一下,先把上一次的迁移给回滚掉啊皮p artisan。M,冒号K。啊,先把这个之前迁移的回用掉,然后加两个字段啊。加一个这个。CNN。中文名啊,中文名同样的,这里也加一个啊。哎,接着重新运行迁移瑞。
19:05
这时候我们再来刷新一下啊,就会多了一个CN的一个字段啊,包括它也是啊,好这样就可以了啊。也就是说,权限。需要这么几个字段。Name。CN和和这个看重器是不是。所以我们这里name写我们的权限的名字,然后cn name啊,写我们中文的一个名字,还有一个。啊,他。是这么写的吧,杠内姆看守器的名字,这个字段你如果不给他会用,你默认就是说你用户默认的看守器。清楚吧,那。用户默认的看守器是什么呢?是这个we部在哪呢?在这个con里面去,Also里面可以看到用户,就是说现在我们系统所有的一个看守器啊,是不是有一个we部有一个API。
20:03
也就是说,如果你不去写。不去指定这个这个的话,它默认会使用这个web。知道吧,他如果使用了这个web,当我们去使用API的用户啊,比如我们这些API的这个用户,你去,呃,做这个验证的时候,是验证不通过的,是你找不到这个权限的。对吧,我们这个项目它本来就是存API的一个项目,没有什么外部的一个页面,所以说啊,这里我们就指定上API清楚了没有。啊,但是你如果每个都指定。你还要多写这么多东西,是不是很麻烦?可以通过什么呢?可以通过这个user模型里面。找一找user这个模型。Model。User模型啊,它有一个。受保护的属性。
21:00
嗯,这个属性。也就是默认的首位。哎,我们把它设置成API,这样,当我们在使用这个user模型的时候,就会使用我们这里设置的默认的这个首位啊,这个看手器。啊,这个字段了啊,这个就可以不聊了啊,这样name我们用什么做name呢?就是权限的名字,权限的名字建议大家使用。我们的路由名字,因为它这个权限名字叫唯一嘛,是不是刚好我们的路由名字是不是唯一的,我们这个路由的name是不是唯一的。对不对。啊,只不过我们。用了这个资源路由,它会自动给我们写上这个路由的名字,而我们自己定义的是不是还没给名字呢?你看一看。来,皮皮。API。看一下所有的一个路由情况来,是不是我们用的资源路由,它会给我们把这个路由的这个名字名称给写上。
22:01
啊,而我们呢,自己去写的一些这个链定义的这个一些uri是没有的是吧。啊,所以我们这里。他既然这个name是唯一的,也就是说权限的名字啊,他认定哪个用户有没有什么权限,就是根据这个他去判断的清楚了吧,而而我们要做的什么权限是基于对路由的权限,所以这里用这个。路由的名字再合适不过了。好,这里我们写上user.user.index用户,这是用户列表,是不是用户列表啊?接着就按照这个啊,大家去去加就行了,要把整个系统所有的我们的路由都加进去。所有的都加进去知道吧。当然时间关系视频里面我们就不加了,我们就拿一个用户来举例啊,拿一个用户来举例其他模块。大家自己去想,用户我们来看看。那这种对针对于我们这种自己定义的没有name的怎么办?可以在后面给他加这个name参数啊。
23:04
啊,可以在后面给你加这个内幕参数。这个是user点。Lock吧。好。接着我们来尝试一下啊。可以看一下。呃,我们的这个user slo现在是没有内的,是不是我们加了之后你再执行。看一看啊。是不是有了?对不对,所以说可以通过这个names方法,给这种单个的路由去加这个路由名称啊,那我们。用户的基本就有了。啊。看看用户都有什么功能。看这也行啊,看这也行,用户的只有一个列表,一个详情和一个。这个禁用和启用啊,只有这三个权限。来,我们把这个权限给录一下。用户详情。用户详情是优点秀。
24:02
用户禁用启用。是。User lock。哎,我们基于路由名字,基于路由名字还有一个好处就是可以啊。处理什么处理我们的路由参数,比如我们详情会跟上一个斜杠,一个用户的ID,对吧,这个ID是一直在变的啊,所以你不能基于这个URL,基于这个name是最合适的路由的名字。好,定义了这个数组之后啊,这里我给大家写上,这里你们要补全啊,补全所有的权限。啊,这个时间关系,我们不在视频里去补啊,你们自己要去补啊。接着去添加选项,现在只是定义了权限的数组,是不是还没有执行添加呢?使用permission model。找到他这个models啊。你可不要有疑问说,哎,我们没有创建它models,为什么会有,你注意它的命用空件,这是我们用这个组件,人家组件自己就创建了这个model了啊,在人家这个组件里面的。
25:02
啊。使用。数组的话使用银色的方法吗?啊,批量添加啊。Insert啊,接着我们去创建一个角色。创建一个超级管理员那个角色。这个创建一个就行了啊,先默认创建一个吧。如果你们要创建多个,也是用这种数字的形式就可以啊。Name啊,中文名字先写上超级管理员,超级管理员。英文名字我们这里就随便写了,比如说super me。啊,或者你怎么写都可以啊,Super面都行。
26:04
角色啊,然后。这个不用定义单独的数组了,直接使用啊,Ruler。找到这个模型,然后使用。把这个数值放进来,创建了一个角色,接着为角色去添加权限啊。为角色添加权限呢,你要一个一个去添加你这一个一个你一个一个你这内幕去添加你,你多麻烦呀。对不对,你看看给角色添加权限啊。比如说为决策项选项使用这个give permision to是不是?你看这个角色的这个模型对象嘛,使用模型对象这个方法,你要一个加,加什么时候,所以它有一个。啊,这个啊往下找。啊,可以直接把所有的权限,也就是我们的这个。Permission or啊,去查这个所有的权限,直接使用它也可以啊。
27:01
好,这样我们就把所有的权限给到了这个超级管理员,这没问题了,超级管理员具备所有的权限很正常。可不可以啊?这样我们就。啊,创建了。角色也创建了。权限啊,以创建的角色为角色分配的权限。是这样的吗?来,我运行迁移一下,试试看我们的数据会不会生成。Artisan。DBC。Class等于。Permission。等于啊,打错了。重新写吧,QPDBC。
28:03
杠杠class等于。这个字段啊。没有默认值,也就是说不能为空。不能为空的话,是因为我们这个隐私的方法导致的啊,它没有用到模型的特性去调用默认的用户模型里面我们设置的。这个它的这个默认的一个首位啊,或者看守器。所以我们改一改。这个先关掉啊,改成啊。啊,改成取一个一条一条创建。
29:00
再来执行一下试试。不报错了是吧。啊,因为我们使用的话,它就会去用这个user默认的这个东西来刷新一下数据。权限是不是有了啊,默认的他用的外国,说明我们这个属性错了啊,这个属性。我再想一想是哪个属性,是这个吗?再试一下,再签一个。啊,重复了啊,不能它这个是唯一的啊,这个是唯一的不能重复,所以我们要把这个原先的先给删掉。删掉之后再来执行。缓存啊,还差不多有缓存。我们虽然把数据库删了,但它有缓存,来找一找。这里先把缓存清掉啊。
30:00
在我们添加之前啊,清空缓存。接下来继续执行再执行啊。角色啊,现在是角色添加不进去了啊,角色表我没删吗?那这里会创建这个角色嘛啊,但是权限已经进来,我们先看看。这里还是web。好像忘了一件事,也就是说当我们使用这个user模型的时候,才会具体的去用到这个属性。而这里是我们直接对权限表进行添加的。你要不给这个资产,它会默认去娶谁?去also里面配置文件里面里面。这个默认的有一个default啊,会去取它取这个默认的。知道吧,啊,除非你把它改成一篇。行吗?啊,或者说你在添加的时候,你把这个字段就是说相当于分组嘛,这个手看手机的这个分组给它加上也行。
31:00
好吧。嗯,我们怎么做呢?先把这个数据删掉吧。一定要保证这个是和我们的API是一致的,要不然我们做权限验证的时候,他会按照这个啊,先会按照这个组去验证。知道吧。把这个先删掉。好,已经没了啊。是。嗯,怎么说呢。不建议你去改它,不建议去改它,那我们手动把它加上加上吧。看一下字段。手动加上线啊,就不去改这个默认的这个配置。好,接下来,嗯。重新执行迁移啊。
32:02
角色角色的报错,先让他报错吧,先不管了,因为角色不能不能重复嘛,嗯。来刷新一下。啊,这个就对的,看看我们的角色表。有这么一条角色啊,当然这个也得。给他改啊。就是我们创建那个角色的时候。先全部清了吧,全部清了吧,整个我们重新执行一遍,好吧。把爵士队给清了。然后角色和权限还有一个关联表。Rule has permission。这个暂时没有,因为一直报错,没有执行完整。接着重写一下。角色,我们也把这个属性给加上。
33:03
接下来执行迁移,因为一直没有走到这里,分配为角色分配权限,所以刚才我们看到这个关联表没有数据。现在重新指向迁移。好成功,那看看权限表。是不是有数据,而且看手机是API对吧,再看看角色表。啊,也是对的啊。接着看我们的。他们的关联,你看角色为二的关联了这几个权限的ID。是不是?这是我们的ID啊。那就来点。这样就迁移完成了。
我来说两句