fix(purchase): 待采购清单的参考价格改按 material_list:referencePrice 管控
修复一个权限旁路:待采购清单的「参考单价」原本后端无条件返回、前端列也没有 任何门控,而 material_list:referencePrice 只授予 SUPER_ADMIN 与 SUPERVISOR。 结果是 WAREHOUSE_MGR(库管) / INBOUND(入库员) / SALES(销售) 虽然都持有 inbound_purchase:pending_pool、能打开待采购清单,就会看到参考价格 —— 而这个 数字他们在物料列表里是被挡住的。等于本页面成了绕过该权限的后门。 参考价格来自 material_base.reference_price,与物料列表同源,因此复用同一个 权限码管控,不另造新码(同源数据用同码,口径才不会漂)。 改动: - 后端 get_pending_purchase_pool 新增 include_reference_price 参数, fail-closed 默认 False;无权限时**整个字段不返回**而不是给 None - 新增 _has_material_reference_price_perm(),判定方式与既有的 _filter_purchase_prices 保持一致(超管/主管放行 + 逐个权限码比对) - 前端「参考单价」列加 hasPermission 门控,TS 类型改为可选 ★ 只挡前端等于没挡(接口仍然裸奔),前后端必须同时改。
This commit is contained in:
@ -53,6 +53,25 @@ def _filter_purchase_prices(item_dict):
|
||||
item_dict.pop('tax_rate', None)
|
||||
|
||||
|
||||
def _has_material_reference_price_perm():
|
||||
"""
|
||||
能否看物料的参考价格。
|
||||
|
||||
★ 参考价格(material_base.reference_price)是受 material_list:referencePrice
|
||||
管控的价格数据,与物料列表同源。任何暴露它的新接口都必须用**同一个码**,
|
||||
否则就成了绕过该权限的后门 —— 物料列表里挡住的数字,换个页面就看到了。
|
||||
判定方式与 _filter_purchase_prices 保持一致(超管/主管放行 + 逐个权限码比对)。
|
||||
"""
|
||||
from app.services.auth_service import AuthService
|
||||
claims = get_jwt()
|
||||
role = claims.get('role', '')
|
||||
if role.upper() in ('SUPER_ADMIN', 'SUPERVISOR'):
|
||||
return True
|
||||
perm_dict = AuthService.get_user_permissions(role, company_name=claims.get('company_name', ''))
|
||||
all_perms = perm_dict.get('menus', []) + perm_dict.get('elements', [])
|
||||
return 'material_list:referencePrice' in all_perms
|
||||
|
||||
|
||||
# --------------------------------------------------------
|
||||
# 1. 采购申请列表
|
||||
# GET /api/v1/purchase
|
||||
@ -452,6 +471,8 @@ def get_pending_purchase_pool():
|
||||
page=page, per_page=limit, keyword=keyword,
|
||||
category=category, material_type=material_type,
|
||||
warning_status=warning_status,
|
||||
# 参考价格按 material_list:referencePrice 管控,无权限时不返回该字段
|
||||
include_reference_price=_has_material_reference_price_perm(),
|
||||
)
|
||||
return jsonify({'code': 200, 'msg': '获取成功', 'data': result}), 200
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user