From e9c957808a1569dabddaa09dcebb34a4293c15b5 Mon Sep 17 00:00:00 2001 From: Pine Date: Sun, 6 Sep 2026 18:26:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Drbac=5Fcompute=5Fpricing?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复rbac模块导入路径:从 ..rbac 改为 ...rbac - 修复require_role不存在的问题:使用role_allowed函数创建check_role辅助函数 - 替换所有require_role调用为check_role --- app/api/routers/rbac_compute_pricing.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/api/routers/rbac_compute_pricing.py b/app/api/routers/rbac_compute_pricing.py index 85626c1..e9f8340 100644 --- a/app/api/routers/rbac_compute_pricing.py +++ b/app/api/routers/rbac_compute_pricing.py @@ -19,7 +19,8 @@ from pydantic import BaseModel from sqlalchemy import select, and_ from ..dependencies import get_db, get_current_user -from ..rbac import write_audit, require_role +from ...rbac import write_audit +from ...domain.rules import role_allowed from ...infrastructure.models import ( ParkTenant, ParkCompany, CompanyMember, TenantDiscount, TenantUserDiscount, @@ -43,6 +44,12 @@ def new_id() -> str: return uuid.uuid4().hex[:24] +def check_role(user: dict, roles: list[str]) -> None: + """检查用户角色,如果不允许则抛出403异常。""" + if not role_allowed(user, *roles): + raise HTTPException(status_code=403, detail="Forbidden: insufficient role") + + # ═══════════════════════════════════════════════════════════════════ # 运营端:载体折扣管理 # ═══════════════════════════════════════════════════════════════════ @@ -60,7 +67,7 @@ async def admin_tenant_discounts( db: Database = Depends(get_db), user: dict = Depends(get_current_user), ): - require_role(user, ["operator"]) + check_role(user, ["operator"]) result = await db.session.execute(select(TenantDiscount).order_by(TenantDiscount.created_at.desc())) items = [] for td in result.scalars().all(): @@ -86,7 +93,7 @@ async def admin_set_tenant_discount( db: Database = Depends(get_db), user: dict = Depends(get_current_user), ): - require_role(user, ["operator"]) + check_role(user, ["operator"]) body.discount = max(0, min(100, int(body.discount))) # 检查载体是否存在 @@ -139,7 +146,7 @@ class StandardPriceBody(BaseModel): async def admin_standard_prices( user: dict = Depends(get_current_user), ): - require_role(user, ["operator"]) + check_role(user, ["operator"]) items = [{"model": k, "price_per_1k": v} for k, v in STANDARD_PRICES.items()] return {"items": items} @@ -152,7 +159,7 @@ async def admin_update_standard_price( db: Database = Depends(get_db), user: dict = Depends(get_current_user), ): - require_role(user, ["operator"]) + check_role(user, ["operator"]) STANDARD_PRICES[model] = max(1, int(body.price_per_1k)) await write_audit(db, action="compute.standard_price_update", resource="standard_price", resource_id=model, detail=f"price={body.price_per_1k}",