fix: 企业账号只能访问授权给本企业的资产
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m25s

/assets/:identifier/* 共用 AssetService.Resolve 解析资产,而店铺数据范围 ApplyShopFilter 对企业账号不加条件,
企业账号可以查询并操作任意卡或设备(资产详情、订单、套餐、停复机、停用、改套餐有效期与已用量、开关轮询、改实名状态)。

- Resolve 对企业账号校验卡或设备当前授权给本企业,未授权与不存在同样返回未找到
- 改套餐有效期、改已用量、停用、开关轮询、改实名状态对企业账号返回无权限;停复机按授权范围放行

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
邹进
2026-10-26 15:05:05 +09:00
parent 7963e5dadd
commit 82a2fcc306
4 changed files with 84 additions and 6 deletions

View File

@@ -391,6 +391,9 @@ func (h *AssetHandler) CurrentPackage(c *fiber.Ctx) error {
// UpdatePackageExpiresAt 修改资产套餐过期时间
// PATCH /api/admin/assets/:identifier/packages/:package_usage_id/expires-at
func (h *AssetHandler) UpdatePackageExpiresAt(c *fiber.Ctx) error {
if err := rejectEnterpriseAssetAdmin(c); err != nil {
return err
}
asset, packageUsageID, err := h.resolveAssetPackageUsagePath(c)
if err != nil {
@@ -417,6 +420,9 @@ func (h *AssetHandler) UpdatePackageExpiresAt(c *fiber.Ctx) error {
// UpdatePackageUsage 修改资产套餐已用量
// PATCH /api/admin/assets/:identifier/packages/:package_usage_id/used-data
func (h *AssetHandler) UpdatePackageUsage(c *fiber.Ctx) error {
if err := rejectEnterpriseAssetAdmin(c); err != nil {
return err
}
asset, packageUsageID, err := h.resolveAssetPackageUsagePath(c)
if err != nil {
return err
@@ -496,6 +502,9 @@ func (h *AssetHandler) Start(c *fiber.Ctx) error {
// Deactivate 停用资产
// PATCH /api/admin/assets/:identifier/deactivate
func (h *AssetHandler) Deactivate(c *fiber.Ctx) error {
if err := rejectEnterpriseAssetAdmin(c); err != nil {
return err
}
if h.assetLifecycleService == nil {
return errors.New(errors.CodeInternalError, "资产生命周期服务未配置")
}
@@ -590,6 +599,9 @@ func (h *AssetHandler) OperationLogs(c *fiber.Ctx) error {
// UpdatePollingStatus 更新资产轮询状态
// PATCH /api/admin/assets/:identifier/polling-status
func (h *AssetHandler) UpdatePollingStatus(c *fiber.Ctx) error {
if err := rejectEnterpriseAssetAdmin(c); err != nil {
return err
}
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam)
@@ -678,6 +690,9 @@ func (h *AssetHandler) UpdateRealnamePolicy(c *fiber.Ctx) error {
// UpdateRealnameStatus 手动更新资产实名状态
// PATCH /api/admin/assets/:identifier/realname-status
func (h *AssetHandler) UpdateRealnameStatus(c *fiber.Ctx) error {
if err := rejectEnterpriseAssetAdmin(c); err != nil {
return err
}
identifier := c.Params("identifier")
if identifier == "" {
return errors.New(errors.CodeInvalidParam)
@@ -770,3 +785,12 @@ func assetIdentifierForAudit(asset *dto.AssetResolveResponse) string {
}
return asset.Identifier
}
// rejectEnterpriseAssetAdmin 拒绝企业账号执行平台管理类资产写操作(改套餐有效期与已用量、停用、开关轮询、改实名状态)。
// 企业账号即使对已授权资产也不能执行这些操作;停复机仍按企业授权范围放行(由 Resolve 约束)。
func rejectEnterpriseAssetAdmin(c *fiber.Ctx) error {
if middleware.GetUserTypeFromContext(c.UserContext()) == constants.UserTypeEnterprise {
return errors.New(errors.CodeForbidden, "企业账号无权执行该资产操作")
}
return nil
}