欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

学院君 基于 Laravel Permission 扩展包在项目中轻松实现 RBAC 权限管理功能 有大用

基于 Laravel Permission 扩展包在项目中轻松实现 RBAC 权限管理功能

一直想整理出一篇单独在 Laravel 中基于 RBAC 实现权限管理的教程,今天总算是交上这份作业了,开始之前,先祭出最终用户权限管理的效果图镇场子:

用户权限管理的效果图

项目初始化

下面正式开始今天的作业,我们基于由 Spatie 维护的 Laravel Permission 扩展包来实现 RBAC 权限管理,Spatie 出品,必属精品。首先需要安装一个干净的 Laravel 项目,然后在项目根目录下通过 Composer 来安装扩展包依赖:

123

创建数据表

先通过如下命令将扩展包提供的数据库迁移文件发布到 database/migrations 目录下:

1

然后不要忘了修改 .env 中的数据库配置以匹配本地数据库设置,完成这一步之后就可以运行下面的命令根据数据库迁移文件生成相应的数据表了:

1

数据库迁移

运行成功后查看数据库会发现新生成了如下数据表:

生成的数据表

配置文件

接下来将扩展包提供的权限配置文件 permission.php 发布到 config 目录下以便对默认配置进行修改:

1

其中主要包含了默认权限、角色模型类以及对应数据表配置,一般而言,保持默认配置即可。

模型类调整

在 User 模型类中使用 HasRoles trait 提供权限相关方法:

User 模型类中使用 HasRoles

安装 Laravel Collective HTML

我们通过 Composer 安装这个扩展包依赖以便后续构建视图页面所需表单:

1

基本使用

完成上述初始化工作后,接下来我们来看一下如何使用 Laravel Permission 扩展包提供的方法来实现一些基本操作。

我们可以通过以下方式创建新的角色和权限:

12345

通过调用用户实例上的动态属性 permissions 获取用户所有权限:

1

通过 pluck 方法获取用户角色名称:

1

还可以通过 Blade 指令验证登录用户是否拥有给定角色:

1234567891011121314151617181920212223

通过 @can 指令验证用户是否拥有给定权限:

123

使用实例

下面我们以为用户分配文章操作权限为例来演示如何在实践中使用 Laravel Permission 扩展包实现 RBAC 权限管理。首先我们通过如下 Artisan 命令生成用户认证相关脚手架代码:

1

上述指令会生成用户登录注册所需的路由、控制器、视图等代码文件。我们需要对生成的代码做少许调整:

登录注册控制器调整

修改 RegisterController 控制器的 create 方法如下:

12345678

转而在 User 模型类中新增修改器方法以便在保存时对密码字段进行加密处理:

123

修改 LoginController 和 RegisterController 控制器的 redirectTo 属性:

1

布局视图文件调整

接下来编辑 resources/views/layouts/app.blade.php 模板文件,新增一个下拉「Admin」链接用于查看所有用户和错误文件,只有具备「Admin」角色的用户才可以看到此链接。此外,我们还创建了一个自定义的 styles.css 文件用于渲染 resources/views/posts/index.blade.php 视图样式:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108

创建错误文件视图模板文件 resources/views/errors/list.blade.php

123456789

编写 public/css/styles.css 文件内容如下:

123

文章相关资源类

处理好布局视图文件后,接下来开始正式编码工作。首先创建文章模型类及其对应数据库迁移文件:

1

然后修改新生成的 CreatePostsTable 迁移类:

12345678910111213141516171819202122232425262728293031

运行如下命令生成对应文章数据表:

1

编辑 Post 模型类以支持批量赋值:

1234

接下来创建文章资源控制器:

1

编写新生成的 PostController 代码如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124

最后注册相应路由到 app/routes/web.php

12

根据 PostController 控制器提供的方法,需要创建四个相应视图:resources\views\posts\index.blade.phpresources\views\posts\create.blade.phpresources\views\posts\show.blade.php 和 \resources\views\posts\edit.blade.php

编写 index.blade.php 代码如下:

123456789101112131415161718192021222324252627

编写 create.blade.php 代码如下:

123456789101112131415161718192021222324252627282930

编写 show.blade.php 代码如下:

12345678910111213141516171819202122232425

最后,编写 edit.blade.php 代码如下:

123456789101112131415161718192021222324252627

完成上述工作后,再次访问项目首页,页面显示如下:

效果图

用户相关资源类

用户对应模型类和数据表已存在,所以我们直接从创建资源控制器开始:

1

编写刚生成的 UserController 代码如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141

注册相应路由到 app/routes/web.php

1

根据 UserController 控制器提供的方法需要新增三个对应视图:resources\views\users\index.blade.phpresources\views\users\create.blade.phpresources\views\users\edit.blade.php

编写 index.blade.php 视图代码如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

编写 create.blade.php 视图代码如下:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

编写 edit.blade.php 视图代码如下:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

至此,用户相关控制器和视图已编写完毕,下面来看权限相关资源类。

权限相关资源类

权限对应模型和数据表也已经存在了,所以只需通过以下命令创建权限资源控制器:

1

编写 PermissionController 控制器代码如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144

注册相应路由到 app/routes/web.php

1

根据 PermissionController 控制器提供的方法,需要创建三个对应视图文件。

首先创建 resources/views/permissions/index.blade.php 文件:

1234567891011121314151617181920212223242526272829303132333435363738394041424344

接下来创建 resources/views/permissions/create.blade.php 视图文件:

12345678910111213141516171819202122232425262728293031323334

最后创建 resources/views/permissions/edit.blade.php 视图文件:

123456789101112131415161718192021222324

最后创建角色相关资源类。

角色相关资源类

和权限一样,对应模型类和数据表已经存在,所以也是从创建资源控制器开始:

1

编写刚生成的 RoleController 控制器代码如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150

注册相应路由到 app/routes/web.php

1

根据上面的 RoleController 控制器,需要创建三个相应的视图文件。

首先创建 resources/views/roles/index.blade.php 视图文件:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

然后创建 resources/views/roles/create.blade.php 视图文件:

1234567891011121314151617181920212223242526272829303132333435

最后创建 resources/views/roles/edit.blade.php 视图文件:

12345678910111213141516171819202122232425262728293031

权限中间件

到这里还没有结束,我们在上面的控制器中有用到 isAdmin 和 clearance 中间件,下面需要来创建并注册这两个中间件。

首先创建 AdminMiddleware 中间件:

1

编写 AdminMiddleware 中间件代码如下:

123456789101112131415161718192021222324252627282930

该中间件的作用主要是用于判断指定用户是否具备管理员权限。通过上面的代码,可以看出系统的第一个用户默认是管理员,以防止第一个用户出现权限死锁的情况。

接下来创建另一个中间件 ClearanceMiddleware

1

编写 ClearanceMiddleware 代码如下:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

该中间件的主要作用是判断用户是否具备给定操作的权限。

将上述两个中间件注册到 app/Http/kernel.php 的 $routeMiddleware 属性中:

12345

最后我们为 401 状态码编写一个错误页面 resources\views\errors\401.blade.php

123456789

至此,我们已经完成了所有的编码工作,接下来对上面编写的代码进行功能测试。

功能测试

根据前面的 isAdmin 中间件实现逻辑,系统第一个用户默认具备管理员权限,这样我们就可以通过这个用户创建必要的权限和角色。

在 http://permission.test/permissions 页面新增四个权限 —— Create Post、Edit Post、Delete Post 以及 Administer roles & permissions:

创建权限

接下来在 http://permission.test/roles 页面创建几个具备相应权限的角色:

创建角色

最后在 http://permission.test/users 页面将「Admin」角色分配给当前登录用户:

分配用户角色

分配成功之后在顶部导航下拉列表中就可以看到「Admin」选项了:

查看用户角色

现在,可以点击「New Article」链接发布新文章了:

测试用户权限

这表示我们已经成功给用户分配了权限。在文章详情页,该用户(管理员)也具备增删改所有权限:

查看用户权限

至此,我们基于 RBAC 实现权限管理的教程已经全部完结,是不是挺简单的?

上一篇: 使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理(二):使用篇

下一篇: 通过内置脚手架快速实现用户认证


分享到以下平台:


相关推荐:

使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理(一):安装配置篇

Laravel 从入门到精通教程  用户认证与授权

使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理(二):使用篇

Laravel 从入门到精通教程  用户认证与授权

在 Voyager 后台管理系统中集成 Entrust 实现 RBAC 权限管理(一) —— 安装

Laravel 优质扩展包系列  权限管理

如果在所有 Laravel 项目中只安装一个扩展包,你会选择哪一个?

Laravel 优质扩展包系列  其它

人人为我,我为人人!Laravel RBAC 权限管理包,快速搭建后台权限功能~

博客


61 条评论
#61    lxyzsl   lxyzsl 评论于 5个月前

这个路由权限都是写死的,不方便管理啊,如果创建了一个新角色且不是要重新修改路由权限了


来自  https://xueyuanjun.com/post/9389

普通分类: