Skip to content

权限及校验

王荣 edited this page Aug 23, 2019 · 2 revisions

权限支持等级关系.

一般的管理端模块权限分为以下三类,基于上图的基础:

  • create/store/update :创建和修改权限
  • destroy:删除权限
  • index/edit/show:查看权限 通常情况下,一个模块只需要以上权限就够了. 如果有额外的接口,则需要创建额外的权限.

权限的创建

权限的创建常用的有两种:

  1. 直接使用管理端权限管理创建
  2. 跟随业务库,在seeder中编写对应的权限.便于安装该库时自动生成相应的权限. 如:
 $parentId = $this->createPermissions("问题", "qa_questions", true, $parentId);
 Permission::create([
      'parent_id' => $parentId,
      'order'     => $this->order += 1,
     "name"      => "问题发布",
     "slug"      => "qa_questions.publish",
]);

说明: Mallto\Admin\Seedern\SeederMaker trait中包含创建权限的基础方法,即上面调用的$parentId = $this->createPermissions("问题", "qa_questions", true, $parentId);则会创建:问题管理和相关的子权限(问题管理查看;问题管理创建/修改;问题管理删除)

trait SeederMaker
{
    protected $routeNames = [
        "index"   => "查看",  //列表页/详情页/show
        "create"  => "创建/修改", //创建页/保存/修改
        "destroy" => "删除", //删除权限
    ];

    /**
     * @param      $name        ,权限名
     * @param      $slug        ,权限标识
     * @param bool $sub         ,是否生成子权限
     * @param int  $parentId    ,父权限id
     * @param bool $closeDelete ,是否关闭创建子权限之`删除`权限
     * @param bool $common      ,是否是所有主体都默认有的公共权限
     * @param bool $closeCreate ,是否关闭创建子权限之`创建/修改`权限
     * @return int
     */
    public function createPermissions(
        $name,
        $slug,
        $sub = true,
        $parentId = 0,
        $closeDelete = false,
        $common = false,
        $closeCreate = false
    ) {
      ...
    }
}

自动校验权限

  • 通过自动权限校验中间件(AutoPermissionMiddleware)来完成
  • 项目拥有者(角色标识owner)拥有全部权限.
  • 理论上管理端的所有接口都要创建对应的权限配置,否则该接口就没有人能访问.
  • 因为全新有父子等级关系,所以拥有父权限即可通过所拥有的子权限的校验.
  • 注意如果重写了/admin路由,一定不能加入权限校验,因为管理端权限校验失败的默认跳转就是这里