使用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使用者状态管理功能的应用
Oct 09 PHP
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
MySql 按时间段查询数据方法(实例说明)
Nov 02 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
php 中奖概率算法实现代码
Jan 25 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 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抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python求解平方根的方法
2015/03/11 Python
python实现简单神经网络算法
2018/03/10 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
《小熊住山洞》教学反思
2014/02/21 职场文书
婚前协议书范本
2014/04/15 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
委托证明模板
2014/09/16 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript