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