使用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
MySQL相关说明
Jan 15 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
php采集速度探究总结(原创)
Apr 18 PHP
cmd下运行php脚本
Nov 25 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
[原创]php获取数组中键值最大数组项的索引值
Mar 17 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
php日历[测试通过]
2008/03/27 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
javascript正则表达式总结
2016/02/29 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
Python之文字转图片方法
2018/05/10 Python
Python 中@property的用法详解
2020/01/15 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
英文自我鉴定
2013/12/10 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
创先争优一句话承诺
2014/05/29 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
化工见习报告范文
2014/10/31 职场文书
2014年党小组工作总结
2014/12/20 职场文书
答谢词范文
2015/01/05 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android