Skip to content

权限的使用

菜单权限的实现

  • 权限标识由模块:控制器:方法组成
  • 先检测用户权限列表中是否有执行该操作的权限
  • 如果检测未通过,同时用户使用了注解权限,则继续检测用户权限列表中是否有执行该操作的权限
  • 如果在控制器类上使用了注解权限,那么该注解权限对该控制器的所有方法都生效
  • 请务必遵循模块/控制器/方法的结构约定
  • 注解的权限标识未必是真实存在的方法,但必须在菜单权限中配置,才能起到鉴权作用

全局数据权限的实现

plugin/jmsadmin/app/model/scopes/AccessDataScope.php中已经定义了全局数据范围,可以在相应的模型中定义权限范围控制字段

php
//权限范围控制字段
const DATA_LIMIT_FIELD = 'create_by';

并且覆盖模型的booted方法

php
protected static function booted(): void
{
    static::addGlobalScope(new AccessDataScope());
}

模型将会按操作者的数据权限对数据进行过滤

局部数据权限的实现

plugin\jmsadmin\app\model\system\DeptModel.php模型中就使用了局部数据权限

php
public function scopeAccessControl(Builder $query, $haveDeptId = false): void
{
    $deptScope = getDeptDataScope($haveDeptId);
    $deptScope = empty($deptScope) ? [0] : $deptScope;
    $query->whereIn('dept_id', $deptScope);
}

可以在查询时显式调用局部数据权限

php
$this->model->accessControl(true)->where('dept_id', $id)->firstOrFail()->toArray()

按需获取数据权限

plugin/jmsadmin/app/functions.php中定义了getDeptDataScope($withCurrDeptId = false)方法,你可以在需要数据权限的位置,通过该方法获取部门列表,自己进行数据范围过滤。

数据权限注意事项

全局数据权限是有局限性的,比如在分类,属性,商品,订单等复杂关联关系的模型中,使用全局数据权限不当将导致意外的情况发生。

最佳实践

请牢记菜单权限和数据权限各自的职责,复杂关联关系的业务,应该在controller的接口中或service的方法中做局部的数据权限验证