From 188d9460fe7dee2409197feee1aad0425e2bde43 Mon Sep 17 00:00:00 2001 From: opsx Date: Tue, 27 Oct 2026 03:02:50 +0000 Subject: [PATCH] =?UTF-8?q?fix(logs):=20=E3=80=8C=E6=89=80=E6=9C=89?= =?UTF-8?q?=E4=BA=BA=E3=80=8D=E7=AD=96=E7=95=A5=E7=BB=84=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=EF=BC=88=E8=A2=AB=E8=AF=AF=E5=88=A4=E4=B8=BA?= =?UTF-8?q?=E5=B7=B2=E5=B1=9E=E4=BA=8E=E5=85=B6=E4=BB=96=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E7=BB=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象:userIds:[0] 新建策略组时报 「用户 0 已属于此数据源的另一个策略组」HTTP 400 根因:validatePolicyGroup 的跨组冲突检查把 EveryoneUserID(0) 当真实用户, 只要已有任何一个「所有人」策略组(如内置默认策略), 再新建含 0 的组必然冲突。 修复:跨组冲突检查跳过 AnyoneUserID(0) —— 它是哨兵值不是真实用户, 允许多个策略组同时包含「所有人」。 验证: POST /logs/policy-groups {userIds:[0]} → 200,id=2 正常创建 POST userIds:[0,2](混选) → 400「「所有人」不能与具体用户同时选择」 GET /logs/policy-groups → 默认策略(所有人 · default 命名空间) 镜像:lghost/lokistack:latest + v0.1 = sha256:3222a8716fdd --- backend/services/log_policy.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/services/log_policy.go b/backend/services/log_policy.go index 827561b..68678ea 100644 --- a/backend/services/log_policy.go +++ b/backend/services/log_policy.go @@ -88,6 +88,11 @@ func validatePolicyGroup(db *repository.JsonDB, group models.LogPolicyGroup, exc return fmt.Errorf("此数据源已有同名策略组") } for _, id := range other.UserIDs { + // AnyoneUserID(0) 是「所有人」哨兵,不是真实用户, + // 允许多个策略组同时包含它(否则新建任何「所有人」策略组都会被这条冲突检查拒掉) + if id == AnyoneUserID { + continue + } if seen[id] { return fmt.Errorf("用户 %d 已属于此数据源的另一个策略组", id) }