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

2020-03-16 16:00:51丽君

<?php namespace App;
use ZizacoEntrustEntrustPermission;
class Permission extends EntrustPermission
{
}

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

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

User

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

<?php

namespace App;

use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
use ZizacoEntrustTraitsEntrustUserTrait;

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内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

相关文章 大家在看