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

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

    内容版权声明:除非注明,否则皆为本站原创文章。

    转载注明出处:http://www.heiqu.com/3988.html