\App\Services\AdminPermissionCacheService

权限缓存服务

职责:负责用户权限码的 Redis 缓存读写与缓存清理。key 一律经注册表映射 (CacheManager::key)——改 key 模板代码无感、纳入治理。反向索引 (role_permissions/permission_roles)已随权限收敛删除;权限码变更失效走模型事件 (invalidateByTable 按 td_sys_permission 推导全用户)。

┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · Key 生成 userPermissionsKey 分区 2 · 权限加载与查询 loadUserPermissions / resolveUserRoleIds / queryUserPermissions getUserPermissions / hasPermission 分区 3 · 委派上界 assertOperatorCoversPermissionIds 分区 4 · 缓存清理 clearUserScopesFor / clearUserPermissions / clearUsersPermissions clearRoleUsersPermissions / clearOnLogout └────────────────────────────────────────────────────────────┘

Summary

Methods
Properties
Constants
userPermissionsKey()
loadUserPermissions()
resolveUserRoleIds()
queryUserPermissions()
getUserPermissions()
hasPermission()
assertOperatorCoversPermissionIds()
clearUserScopesFor()
clearUserPermissions()
clearUsersPermissions()
clearRoleUsersPermissions()
clearOnLogout()
No public properties found
No constants found
No protected methods found
No protected properties found
N/A
No private methods found
No private properties found
N/A

Methods

userPermissionsKey()

userPermissionsKey(int  $userId) : string

用户权限码缓存的注册表 key(user:permission:list)

Parameters

int $userId

Returns

string —

loadUserPermissions()

loadUserPermissions(int  $userId) : string[]

从数据库汇总用户的全部权限码,写入 Redis Set。 Redis 操作用 pipeline 合并(del+sadd+expire 一次往返),避免 3 次网络调用。

Parameters

int $userId

Returns

string[] —

权限码列表

resolveUserRoleIds()

resolveUserRoleIds(int  $userId) : int[]

解析用户直授角色 ID(status=1 有效角色;岗位只管数据范围,不参与功能权限)。

Parameters

int $userId

Returns

int[] —

queryUserPermissions()

queryUserPermissions(int  $userId) : array

查询用户全部权限码(从数据库)。

角色管功能:用户功能权限 = 直授角色分配的权限码 ∪ 个人权限(V6.3,仅按钮/接口权限)。

Parameters

int $userId

Returns

array —

getUserPermissions()

getUserPermissions(int  $userId) : string[]

从 Redis 读取用户权限码列表。

Parameters

int $userId

Returns

string[] —

hasPermission()

hasPermission(int  $userId, string  $permissionCode) : bool

校验用户是否拥有指定权限码。 超管判断由调用方负责(PermissionAuthMiddleware 已加载 user,避免重复查库); 此处只做 Redis Set 校验 + 缓存未命中时重建。

Parameters

int $userId
string $permissionCode

Returns

bool —

assertOperatorCoversPermissionIds()

assertOperatorCoversPermissionIds(array  $permissionIds) : void

委派上界:提交的权限 id 必须 ⊆ 操作者自身权限 id(超管豁免)。

ConfigRoleService::syncPermissions 与 UserConfigService::syncUserPermissions 共用单源 (此前两份逐字相同实现有分叉风险)。

Parameters

array $permissionIds

Throws

\InvalidArgumentException

含越权权限码时抛 403

clearUserScopesFor()

clearUserScopesFor(int[]  $userIds) : void

清理多个用户的可见部门集缓存(岗位/任职/范围变更四处循环/单点 forget 收敛单源)。

Parameters

int[] $userIds

clearUserPermissions()

clearUserPermissions(int  $userId) : void

清理指定用户的权限缓存。 user_permissions 是裸 Redis Set(sismember 性能);user_menus 已迁 CacheManager(tag 存储, 裸 Redis del 无效,必须走 CacheManager::forget)。 user:dept:scope(可见部门集)同属用户层缓存一并清——删用户/任职同步后 不再残留孤儿缓存(原缺口:td_sys_user_dept 批量直写不触发模型事件,仅靠此手动清)。

Parameters

int $userId

clearUsersPermissions()

clearUsersPermissions(int[]  $userIds) : void

清理多个用户的权限缓存。

Parameters

int[] $userIds

clearRoleUsersPermissions()

clearRoleUsersPermissions(int  $roleId) : void

清理指定角色下所有用户的权限缓存(直授角色来源)。 同步直接清:原走 database 队列(ClearUserCaches::dispatch),线上无常驻 worker 则永远不执行。

Parameters

int $roleId

clearOnLogout()

clearOnLogout(int  $userId) : void

登出时清理用户权限缓存(user_permissions Redis Set + user_menus tag 存储)。

Parameters

int $userId