fix: 修正角色权限分配异常问题

This commit is contained in:
皓月归尘 2025-02-27 21:31:17 +08:00
parent 7d4170a3c3
commit 5c55f4acde
3 changed files with 21 additions and 6 deletions

View File

@ -14,7 +14,7 @@ from annotation.auth import Auth, hasAdmin
from annotation.log import Log from annotation.log import Log
from config.constant import BusinessType, RedisKeyConfig from config.constant import BusinessType, RedisKeyConfig
from controller.login import LoginController from controller.login import LoginController
from models import Permission from models import Permission, RolePermission
from schemas.common import BaseResponse from schemas.common import BaseResponse
from schemas.permission import AddPermissionParams, GetPermissionInfoResponse, GetPermissionListResponse from schemas.permission import AddPermissionParams, GetPermissionInfoResponse, GetPermissionListResponse
from utils.response import Response from utils.response import Response
@ -73,8 +73,8 @@ async def add_permission(request: Request, params: AddPermissionParams):
@Auth(permission_list=["permission:btn:delete"]) @Auth(permission_list=["permission:btn:delete"])
async def delete_permission(request: Request, id: str = Path(description="权限ID")): async def delete_permission(request: Request, id: str = Path(description="权限ID")):
if permission := await Permission.get_or_none(id=id, del_flag=1): if permission := await Permission.get_or_none(id=id, del_flag=1):
permission.del_flag = 0 # 移除角色权限
await permission.save() await delete_permission_recursive(permission_id=permission.id)
# 更新用户信息缓存 # 更新用户信息缓存
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*') userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
if userInfos: if userInfos:
@ -88,6 +88,20 @@ async def delete_permission(request: Request, id: str = Path(description="权限
return Response.error(msg="删除权限失败,权限不存在!") return Response.error(msg="删除权限失败,权限不存在!")
async def delete_permission_recursive(permission_id: str):
"""
递归删除权限及其附属权限
:param permission_id: 权限ID
:return:
"""
await Permission.filter(id=permission_id, del_flag=1).update(del_flag=0)
await RolePermission.filter(permission_id=permission_id, del_flag=1).update(del_flag=0)
sub_permissions = await Permission.filter(parent_id=permission_id, del_flag=1).all()
for sub_department in sub_permissions:
await delete_permission_recursive(sub_department.id)
return True
@permissionAPI.put("/update/{id}", response_model=BaseResponse, response_class=JSONResponse, summary="更新权限") @permissionAPI.put("/update/{id}", response_model=BaseResponse, response_class=JSONResponse, summary="更新权限")
@permissionAPI.post("/update/{id}", response_model=BaseResponse, response_class=JSONResponse, summary="更新权限") @permissionAPI.post("/update/{id}", response_model=BaseResponse, response_class=JSONResponse, summary="更新权限")
@Log(title="更新权限", business_type=BusinessType.UPDATE) @Log(title="更新权限", business_type=BusinessType.UPDATE)

View File

@ -305,11 +305,11 @@ async def update_role_permission(request: Request, params: AddRolePermissionPara
department_permissions = await Permission.filter(del_flag=1).values("id") department_permissions = await Permission.filter(del_flag=1).values("id")
else: else:
department_permissions = await Permission.filter(is_admin=False, del_flag=1).values("id") department_permissions = await Permission.filter(is_admin=False, del_flag=1).values("id")
department_permissions = filterKeyValues(department_permissions, "id") department_permissions = await filterKeyValues(department_permissions, key="id", convert_type=str)
if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments): if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments):
# 已有角色权限 # 已有角色权限
rolePermissions = await RolePermission.filter(role_id=role.id, del_flag=1).values("permission_id") rolePermissions = await RolePermission.filter(role_id=role.id, del_flag=1).values("permission_id")
rolePermissions = await filterKeyValues(rolePermissions, "permission_id") rolePermissions = await filterKeyValues(rolePermissions, key="permission_id", convert_type=str)
# 利用集合筛选出角色权限中不存在的权限 # 利用集合筛选出角色权限中不存在的权限
delete_list = set(rolePermissions).difference(set(params.permission_ids)) delete_list = set(rolePermissions).difference(set(params.permission_ids))
# 利用集合筛选出角色权限中新增的权限 # 利用集合筛选出角色权限中新增的权限

View File

@ -132,7 +132,8 @@ class QueryController:
keepAlive="permission__keep_alive", keepAlive="permission__keep_alive",
hiddenTag="permission__hidden_tag", hiddenTag="permission__hidden_tag",
showLink="permission__show_link", showLink="permission__show_link",
showParent="permission__show_parent" showParent="permission__show_parent",
isAdmin="permission__is_admin",
) )
permissions.extend(permission) permissions.extend(permission)
return permissions return permissions