使用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 相关文章推荐
常用表单验证类,有了这个,一般的验证就都齐了。
Dec 06 PHP
php 数组的一个悲剧?
May 11 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
深入理解PHP变量的值类型和引用类型
Oct 21 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
thinkphp分页集成实例
Jul 24 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
实现php删除链表中重复的结点
Sep 27 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
Oct 08 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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 团购折扣计算公式
2011/11/24 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
js自定义事件代码说明
2011/01/31 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
简单实现js悬浮导航效果
2017/02/05 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
详细讲解Python中的文件I/O操作
2015/05/24 Python
基于Python os模块常用命令介绍
2017/11/03 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
详解python metaclass(元类)
2020/08/13 Python
2014年创先争优活动总结
2014/05/04 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
道歉信怎么写
2015/05/12 职场文书