构思:使用spatie/Laravel-permission的角色与权限模式改变为权限组与用户模式

前言:spatie/Laravel-permission可以快捷的创建一个权限和角色,并为角色赋予权限,给用户赋予角色,从而让用户继承角色的权限。这种模式适用用权限不是太过复杂的场景,但是一般的后台设计都涉及了权限分组类似这样的:
在这里插入图片描述
一般设计是直接根据不同情况,创建不同的权限组,再把用户分配到对应的权限组里面去(一个用户可以对应多个权限组),从而简化对用户的权限管理操作

一、预热:关于spatie/Laravel-permission的基本操作
参考文档

基本使用

<?php
/**
 * Created by PhpStorm.
 * User: zheng
 * Date: 2019/6/21
 * Time: 17:12
 */

namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\User;

class UserController extends Controller
{

    /**
     *  创建角色
     *  说明,对迁移文件进行了修改,增加了一个description字段用于角色的描述
     */
    public function baseRole()
    {
        Role::create(['name'=>'admin','description'=>'管理员']);
        echo 'ok';
    }
    /**
     *  创建权限
     */
    public function addPermissions()
    {
        $permission = Permission::create(['name' => 'template/list','description'=>'点货模板列表']);
        echo 'ok';
    }

    /**
     *  给角色添加权限
     */
    public function givePermission()
    {
        $role  = Role::where('name','template')->first();
        $bool =  $role->syncPermissions(['template/list']);
        echo $bool;
    }

    /**
     *  赋予用户角色和权限
     *  说明:角色的权限是自动继承的,可以通过赋予用户角色让用户继承角色的权限,这种权限叫做“继承权限”,
     *   可以通过getPermissionsViaRoles()方法获取,也可以直接给用户赋予权限,这种权限叫做“直接权限”,
     *   可以通过getDirectPermissions()方法获取;
     *   getAllPermissions方法可以获取用户的所有权限(继承权限和直接权限)
     */
    public function giveUserRole()
    {
        $user = User::first();
       // $user->givePermissionTo('template/list'); //直接给用户添加权限
        $user->assignRole('product'); //给用户分配角色(同时继承该角色的权限)
    //    $user->getPermissionsViaRoles(); //从用户角色继承权限(获取当前用户角色的所以权限)
        //赋予当前角色的权限给用户(继承权限变为直接权限,当角色删除时,这些权限依旧存在)
        $user->givePermissionTo($user->getPermissionsViaRoles());
        echo $user;
    }

    /**
     *  获取用户的所有权限
     */
    public function getUserPermissionsList()
    {
        $user = User::first();
        $user->givePermissionTo('product/list');
        echo  $user->getAllPermissions();
    }

}

二、思路转换
将spatie/Laravel-permission中的角色表(roles)当做是权限分组表,首先是新增权限分组(spatie/Laravel-permission的创建角色),例如表单是这样的:
在这里插入图片描述
然后为这个权限分组(角色)编辑权限,例如点击编辑权限跳转的页面是这样的:
在这里插入图片描述
展示当前权限组(角色)的所有权限,可以删除权限(移除角色的某个权限),也可以点击右上角的加号弹窗增加权限(给角色增加某个权限),弹窗里面一个可搜索的下拉框,里面是所有的权限列表,当然之前还有一个页面添加权限(role表的记录),这个role表也建议多增加一个字段描述一下当前权限,并且建议权限名就为接口的api,方便鉴权时直接通过api来鉴权(使用$user->hasPermissionTo(‘权限名’));
到这一步再没有改变spatie/Laravel-permission库任何东西的情况下就为权限进行了分组操作,其实当前的权限分组就是spatie/Laravel-permission的为角色赋予权限,以上的全部操作都是使用spatie/Laravel-permission提供的api进行。
最后一步就是给用户绑定权限组了,相当于是spatie/Laravel-permission中的给用户分配角色(权限组),从而让用户继承这些权限组(角色)的权限(使用getPermissionsViaRoles())获取权限
在这里插入图片描述

三、优缺点总结

优点:不改动spatie/Laravel-permission的前提下(迁移文件的数据表加了字段对api调用没有影响),使用spatie/Laravel-permission的方法便捷的对权限进行分组,方便快速开发权限模块;
缺点:使用这个思路和权限模块中的用户都只能是继承权限,即只能通过不同的权限组获取权限,不能使用直接权限(只能通过角色继承,不能直接赋予用户权限),这就使用户分组时可能会分出几个权限类似的组去到达同一个模块的不同权限的操作,例如普通订单组(只能查看)和订单操作组(可以查看,统计,汇总,删除)。

说明:使用这种思路去完成权限模块,其实spatie/Laravel-permission中的model_has_permissions表就没有任何作用了,并且强烈建议不要使用givePermissionTo直接给用户权限,因为这样会打破权限组的限制作用,使这个权限模块理解起来很混乱,如果绕过权限组直接给用户分配权限,就使得当前用户与这个分配的权限所对应的权限组们形成间接的联系,但这个用户是不属于这些权限组中的任何一个的。

四、改进:当对分组要求更细时, 还可以对权限表进行一些字段补充,创建权限分组时从组装的权限列表中进行选择,如下图所示:
在这里插入图片描述
这样创建权限分组(角色)时就可以根据更加灵活,权限表修改的内容如下:

   Schema::create($tableNames['permissions'], function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('pid');
            $table->string('guard_name');
            $table->integer('is_hide')->comment('是否隐藏 1=隐藏 0=显示')->default(0);
            $table->integer('pid')->comment('父权限ID')->default(0);
            $table->integer('order_level')->comment('排序位置');
            $table->timestamps();
        });
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值