更新bug
This commit is contained in:
@@ -164,10 +164,8 @@ class AdminLogic extends BaseLogic
|
||||
|
||||
// 禁用或更换角色后.设置token过期
|
||||
$roleId = AdminRole::where('admin_id', $params['id'])->column('role_id');
|
||||
$editRole = false;
|
||||
if (!empty(array_diff_assoc($roleId, $params['role_id']))) {
|
||||
$editRole = true;
|
||||
}
|
||||
$submittedRoleIds = self::normalizeRoleIds($params['role_id'] ?? []);
|
||||
$editRole = self::roleIdsChanged($roleId, $submittedRoleIds);
|
||||
|
||||
if ($params['disable'] == 1 || $editRole) {
|
||||
$tokenArr = AdminSession::where('admin_id', $params['id'])->select()->toArray();
|
||||
@@ -177,14 +175,13 @@ class AdminLogic extends BaseLogic
|
||||
}
|
||||
|
||||
Admin::update($data);
|
||||
(new AdminAuthCache($params['id']))->clearAuthCache();
|
||||
|
||||
// 删除旧的关联信息
|
||||
AdminRole::delByUserId($params['id']);
|
||||
AdminDept::delByUserId($params['id']);
|
||||
AdminJobs::delByUserId($params['id']);
|
||||
// 角色
|
||||
self::insertRole($params['id'], $params['role_id']);
|
||||
self::insertRole($params['id'], $submittedRoleIds);
|
||||
// 部门
|
||||
self::insertDept($params['id'], $params['dept_id'] ?? []);
|
||||
// 岗位
|
||||
@@ -194,6 +191,13 @@ class AdminLogic extends BaseLogic
|
||||
self::importDoctorAccountToIm($params['id'], $params['name']);
|
||||
|
||||
Db::commit();
|
||||
// 必须在角色关联提交后删除该账号的 URI 权限缓存,避免并发请求重新写入旧权限。
|
||||
try {
|
||||
(new AdminAuthCache($params['id']))->clearAuthCache();
|
||||
} catch (\Throwable $cacheError) {
|
||||
// 数据已经提交,缓存清理失败不能把成功的编辑伪装成失败;记录后等待缓存自然过期。
|
||||
Log::warning('管理员角色权限缓存清理失败:admin_id=' . $params['id'] . ',error=' . $cacheError->getMessage());
|
||||
}
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
@@ -363,7 +367,8 @@ class AdminLogic extends BaseLogic
|
||||
*/
|
||||
public static function insertRole($adminId, $roleIds)
|
||||
{
|
||||
if (!empty($roleIds)) {
|
||||
$roleIds = self::normalizeRoleIds($roleIds);
|
||||
if ($roleIds !== []) {
|
||||
// 角色
|
||||
$roleData = [];
|
||||
foreach ($roleIds as $roleId) {
|
||||
@@ -376,6 +381,33 @@ class AdminLogic extends BaseLogic
|
||||
}
|
||||
}
|
||||
|
||||
/** @return int[] */
|
||||
private static function normalizeRoleIds(mixed $roleIds): array
|
||||
{
|
||||
if (!is_array($roleIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$normalized = array_values(array_unique(array_filter(
|
||||
array_map('intval', $roleIds),
|
||||
static fn (int $roleId): bool => $roleId > 0
|
||||
)));
|
||||
sort($normalized, SORT_NUMERIC);
|
||||
|
||||
return $normalized;
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色是无序集合;新增、移除或替换都必须使现有 Token 失效,仅顺序变化不算修改。
|
||||
*
|
||||
* @param array<int|string,mixed> $currentRoleIds
|
||||
* @param array<int|string,mixed> $submittedRoleIds
|
||||
*/
|
||||
private static function roleIdsChanged(array $currentRoleIds, array $submittedRoleIds): bool
|
||||
{
|
||||
return self::normalizeRoleIds($currentRoleIds) !== self::normalizeRoleIds($submittedRoleIds);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @notes 新增部门
|
||||
@@ -453,4 +485,4 @@ class AdminLogic extends BaseLogic
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user