refactor(rbac): migrate API permission checks to resource:action format

Replace all legacy dotted permission codes (vms.view, proxmox.manage, ...)
in PermissionChecker/has_permission across app/api with the new
resource:action format (vm:view, server:manage, ...), per LEGACY_PERMISSION_MAP.
All 33 codes used by the API are now registered in the permission registry.

Also switch the /api/auth/me admin branch to get_all_permissions_v2 so the
endpoint emits permissions in the new format only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 02:07:48 +05:00
parent 57513c4dc9
commit de967c35e0
19 changed files with 220 additions and 220 deletions

View File

@@ -66,7 +66,7 @@ class DeployTaskStatusResponse(BaseModel):
@router.get("/api/groups", response_model=List[OSTemplateGroupResponse])
def list_template_groups(
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.view"))
current_user: User = Depends(PermissionChecker("template:view"))
):
"""Получить список всех групп шаблонов"""
groups = db.query(OSTemplateGroup).order_by(OSTemplateGroup.sort_order).all()
@@ -77,7 +77,7 @@ def list_template_groups(
def create_template_group(
group_data: OSTemplateGroupCreate,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""Создать новую группу шаблонов"""
# Check if group with same name exists
@@ -101,7 +101,7 @@ def create_template_group(
def get_template_group(
group_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.view"))
current_user: User = Depends(PermissionChecker("template:view"))
):
"""Получить группу шаблонов по ID"""
group = db.query(OSTemplateGroup).filter(OSTemplateGroup.id == group_id).first()
@@ -115,7 +115,7 @@ def update_template_group(
group_id: int,
group_data: OSTemplateGroupUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""Обновить группу шаблонов"""
group = db.query(OSTemplateGroup).filter(OSTemplateGroup.id == group_id).first()
@@ -137,7 +137,7 @@ def update_template_group(
def delete_template_group(
group_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""Удалить группу шаблонов"""
group = db.query(OSTemplateGroup).filter(OSTemplateGroup.id == group_id).first()
@@ -163,7 +163,7 @@ def delete_template_group(
@router.get("/api/templates", response_model=List[OSTemplateWithGroup])
def list_os_templates(
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.view")),
current_user: User = Depends(PermissionChecker("template:view")),
group_id: int = None,
server_id: int = None,
vm_type: Optional[str] = None,
@@ -206,7 +206,7 @@ def list_os_templates(
def create_os_template(
template_data: OSTemplateCreate,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""Создать новый OS шаблон"""
# Validate group exists
@@ -243,7 +243,7 @@ def create_os_template(
def get_os_template(
template_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.view"))
current_user: User = Depends(PermissionChecker("template:view"))
):
"""Получить OS шаблон по ID"""
template = db.query(OSTemplate).filter(OSTemplate.id == template_id).first()
@@ -269,7 +269,7 @@ def update_os_template(
template_id: int,
template_data: OSTemplateUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""Обновить OS шаблон"""
template = db.query(OSTemplate).filter(OSTemplate.id == template_id).first()
@@ -304,7 +304,7 @@ def update_os_template(
def delete_os_template(
template_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""Удалить OS шаблон"""
template = db.query(OSTemplate).filter(OSTemplate.id == template_id).first()
@@ -323,7 +323,7 @@ def delete_os_template(
def discover_proxmox_templates(
server_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.view"))
current_user: User = Depends(PermissionChecker("template:view"))
):
"""
Обнаружить все VM-шаблоны на Proxmox сервере.
@@ -562,7 +562,7 @@ def _do_auto_import(server_id: int, username: str):
def auto_import_templates(
server_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.manage"))
current_user: User = Depends(PermissionChecker("template:manage"))
):
"""
Синхронный импорт шаблонов с Proxmox сервера.
@@ -1006,7 +1006,7 @@ def _do_deploy_sync(task_id: int, deploy_data: VMDeployRequest,
async def deploy_vm_from_template(
deploy_data: VMDeployRequest,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("vms.create"))
current_user: User = Depends(PermissionChecker("vm:create"))
):
"""
Асинхронный деплой VM из шаблона.
@@ -1034,7 +1034,7 @@ async def deploy_vm_from_template(
raise HTTPException(status_code=400, detail=f"Минимум {template.min_disk} GB диска")
# Resolve owner / SSH keys (admin may target another user)
is_admin = current_user.has_permission("users.manage") or current_user.is_admin
is_admin = current_user.has_permission("user:manage") or current_user.is_admin
instance_owner_id = current_user.id
if deploy_data.owner_id and deploy_data.owner_id != current_user.id:
if not is_admin:
@@ -1105,7 +1105,7 @@ async def get_deploy_task_status(
def get_quick_deploy_info(
template_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(PermissionChecker("templates.view"))
current_user: User = Depends(PermissionChecker("template:view"))
):
"""Получить информацию для быстрого развертывания VM"""
template = db.query(OSTemplate).filter(OSTemplate.id == template_id).first()