使用Entrust扩展包在laravel 中实现RBAC的功能


Posted in PHP onMarch 16, 2020

想要在Laravel中使用Entrust,首先需要通过Composer来安装其依赖包:

composer require zizaco/entrust 5.2.x-de

安装完成后需要在config/app.php中注册服务提供者到providers数组:

Zizaco\Entrust\EntrustServiceProvider::class,

同时在该配置文件中注册相应门面到aliases数组:

'Entrust' => Zizaco\Entrust\EntrustFacade::class,

如果你想要使用中间件(要求Laravel 5.1或更高版本)还需要添加如下代码到 app/Http/Kernel.php 的 routeMiddleware 数组:

'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,

②配置

在配置文件config/auth.php中设置合适的值,Entrust会使用这些配置值来选择相应的用户表和模型类:

'providers' => [
 'users' => [
 'driver' => 'eloquent',
 'model' => App\User::class,
 'table' => 'users',
 ],
],

你还可以发布该扩展包的配置以便后续自定义相关表名以及模型类的命名空间:

php artisan vendor:publish

该命令会在 config 目录下创建一个 entrust.php 文件。

3、用户角色权限表

接下来我们使用Entrust提供的迁移命令生成迁移文件:

php artisan entrust:migration

如果执行上面的 命令出现 以下的错误:

使用Entrust扩展包在laravel 中实现RBAC的功能 

处理方法: vendor-> zizaco-> entrust-> src-> commands-> MigrationCommand.php ,并将”fire“方法更改为”handle“ 然后通过以下命令生成相应的数据表:

php artisan migrate

最终会生成4张新表:

  • roles —— 存储角色
  • permissions —— 存储权限
  • role_user —— 存储角色与用户之间的多对多关系
  • permission_role —— 存储角色与权限之间的多对多关系

4、模型类

Role
我们需要创建Role模型类app/Role.php并编辑其内容如下:

<?php namespace App;
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole
{
}

Role模型拥有三个主要属性:

  • name —— 角色的唯一名称,如“admin”,“owner”,“employee”等
  • display_name —— 人类可读的角色名,例如“后台管理员”、“作者”、“雇主”等
  • description —— 该角色的详细描述
  • display_name 和 description 属性都是可选的,在数据库中的相应字段默认为空。

Permission

接下来创建Permission模型app/Permission.php并编辑其内容如下:

<?php namespace App;
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission
{
}

Permission模型也有三个主要属性:

  • name —— 权限的唯一名称,如“create-post”,“edit-post”等
  • display_name —— 人类可读的权限名称,如“发布文章”,“编辑文章”等
  • description —— 该权限的详细描述

User

接下来我们在User模型中使用EntrustUserTrait:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Zizaco\Entrust\Traits\EntrustUserTrait;

class User extends Authenticatable
{
 use Notifiable;
 use EntrustUserTrait;

 /**
 * The attributes that are mass assignable.
 *
 * @var array
 */
 protected $fillable = [
 'name', 'email', 'password',
 ];

 /**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
 protected $hidden = [
 'password', 'remember_token',
 ];
}

这将会建立 User 与 Role 之间的关联关系:在User模型中添加 roles()  hasRole($name)  can($permission) 以及 ability($roles,$permissions,$options) 方法。

软删除

使用Entrust提供的迁移命令生成的关联关系表中默认使用了 onDelete('cascade') 以便父级记录被删除后移除其对应的关联关系。如果你由于某种原因不能在数据库中使用级联删除,那么可以在 EntrustRole 、 EntrustPermission 类以及 HasRole trait提供的事件监听器中手动删除关联表中的记录。如果模型使用了软删除,那么当不小心误删除数据时,事件监听器将不会删除关联表数据。不过,由于Laravel事件监听器的局限性,所以暂时无法区分是调用 delete() 还是 forceDelete() ,基于这个原因,在你删除一个模型之前,必须手动删除所有关联数据(除非你的数据表使用了级联删除):

$role = Role::findOrFail(1); // 获取给定权限

// 正常删除
$role->delete();
// 强制删除
$role->users()->sync([]); // 删除关联数据
$role->perms()->sync([]); // 删除关联数据

$role->forceDelete(); // 不管透视表是否有级联删除都会生效

总结

到此这篇关于使用Entrust扩展包在laravel 中实现RBAC的功能的文章就介绍到这了,更多相关Entrust扩展包实现RBAC内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP关联数组的10个操作技巧
Jan 21 PHP
基于PHP5魔术常量与魔术方法的详解
Jun 13 PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
PHP异常类及异常处理操作实例详解
Dec 19 PHP
用php定义一个数组最简单的方法
Oct 04 PHP
PHP代码加密的方法总结
Mar 13 #PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 #PHP
YII2框架中actions的作用与使用方法示例
Mar 13 #PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 #PHP
TP5框架安全机制实例分析
Apr 05 #PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 #PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 #PHP
You might like
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP读取目录下所有文件的代码
2008/01/07 PHP
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
dojo随手记 gird组件引用
2011/02/24 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python与Redis的连接教程
2015/04/22 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
基于python实现从尾到头打印链表
2019/11/02 Python
大学生蛋糕店创业计划书
2014/01/13 职场文书
听课评语大全
2014/04/30 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
舞出我人生观后感
2015/06/16 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python