使用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 xml-rpc远程调用
Dec 19 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php实现RSA加密类实例
Mar 26 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
php使用file函数、fseek函数读取大文件效率对比分析
Nov 04 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
Laravel 数据库加密及数据库表前缀配置方法
Oct 10 PHP
PHP RabbitMQ消息列队
May 11 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简单获取视频预览图的方法
2015/03/12 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python3离线安装Requests模块问题
2019/10/13 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
python对文件的操作方法汇总
2020/02/28 Python
django 实现简单的插入视频
2020/04/07 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
文明家庭先进事迹材料
2014/05/14 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
会议主持词开场白
2015/05/28 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
mysql事务对效率的影响分析总结
2021/10/24 MySQL