更新
This commit is contained in:
@@ -19,7 +19,8 @@ use think\facade\Config;
|
||||
* - DEPT (3) = 仅本部门(取 admin 全部部门的并集,不含子孙)
|
||||
* - SELF (4) = 仅本人
|
||||
*
|
||||
* 多角色时取「范围最大」= data_scope 最小值。
|
||||
* 多角色时取「最严格」可见范围 = data_scope 最大值(1=全部 … 4=仅本人),
|
||||
* 与常见「数据权限取交集」一致,避免挂了一个「全部」角色就把其它角色的部门范围冲掉。
|
||||
* root 管理员固定为 ALL。未挂任何部门时,范围退化为 SELF(可由 config 关闭)。
|
||||
*
|
||||
* 关键返回:`getVisibleAdminIds` 返回 int[](可见 admin_id 集合)或 null(ALL = 不过滤)。
|
||||
@@ -42,10 +43,7 @@ class DataScopeService
|
||||
if ((int) ($adminInfo['root'] ?? 0) === 1) {
|
||||
return self::SCOPE_ALL;
|
||||
}
|
||||
$roleIds = array_values(array_filter(array_map(
|
||||
'intval',
|
||||
is_array($adminInfo['role_id'] ?? null) ? $adminInfo['role_id'] : []
|
||||
)));
|
||||
$roleIds = self::normalizeRoleIds($adminInfo['role_id'] ?? null);
|
||||
$exempt = array_map('intval', Config::get('project.data_scope.exempt_roles', []) ?: []);
|
||||
if ($roleIds !== [] && array_intersect($roleIds, $exempt) !== []) {
|
||||
return self::SCOPE_ALL;
|
||||
@@ -59,11 +57,50 @@ class DataScopeService
|
||||
$scopes = array_values(array_filter(array_map('intval', $scopes), static function (int $v): bool {
|
||||
return $v >= self::SCOPE_ALL && $v <= self::SCOPE_SELF;
|
||||
}));
|
||||
// 角色存在但库中无有效 data_scope(缺失/脏数据/已删角色):宁可收窄到「仅本人」,避免误放开到全站
|
||||
if ($scopes === []) {
|
||||
return self::SCOPE_ALL;
|
||||
return self::SCOPE_SELF;
|
||||
}
|
||||
|
||||
return (int) min($scopes);
|
||||
return (int) max($scopes);
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一解析 token/cache 中的 role_id(数组 | 单整数 | JSON 字符串)。
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
private static function normalizeRoleIds(mixed $raw): array
|
||||
{
|
||||
if ($raw === null || $raw === '') {
|
||||
return [];
|
||||
}
|
||||
if (\is_int($raw) || \is_float($raw)) {
|
||||
$v = (int) $raw;
|
||||
|
||||
return $v > 0 ? [$v] : [];
|
||||
}
|
||||
if (\is_string($raw) && is_numeric($raw)) {
|
||||
$v = (int) $raw;
|
||||
|
||||
return $v > 0 ? [$v] : [];
|
||||
}
|
||||
if (\is_string($raw)) {
|
||||
$decoded = json_decode($raw, true);
|
||||
if (\is_array($decoded)) {
|
||||
$raw = $decoded;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
if (!\is_array($raw)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return array_values(array_filter(array_map(
|
||||
static fn ($v): int => (int) $v,
|
||||
$raw
|
||||
), static fn (int $v): bool => $v > 0));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user