fix: 系统性修复安全问题、性能问题和错误处理
安全问题修复: - X-Forwarded-For越界检查(auth.go) - checkTokenStatus Context参数传递(auth.go) - Type Assertion安全检查(auth.go) 性能问题修复: - TokenCache过期清理机制 - BruteForceProtection过期清理 - InMemoryIdempotencyStore过期清理 错误处理修复: - AuditStore.Emit返回error - domain层emitAudit辅助方法 - List方法返回空slice而非nil - 金额/价格负数验证 架构一致性: - 统一使用model.RoleHierarchyLevels 新增功能: - Alert API完整实现(CRUD+Resolve) - pkg/error错误码集中管理
This commit is contained in:
@@ -3,6 +3,7 @@ package domain
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"log"
|
||||
"net/netip"
|
||||
"time"
|
||||
|
||||
@@ -160,11 +161,24 @@ func NewSettlementService(store SettlementStore, earningStore EarningStore, audi
|
||||
}
|
||||
}
|
||||
|
||||
// emitAudit 安全记录审计日志(失败只记录错误,不影响主流程)
|
||||
func (s *settlementService) emitAudit(ctx context.Context, event audit.Event) {
|
||||
if err := s.auditStore.Emit(ctx, event); err != nil {
|
||||
log.Printf("[AUDIT_ERROR] failed to emit audit event: %v, object_type=%s, object_id=%d, action=%s",
|
||||
err, event.ObjectType, event.ObjectID, event.Action)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *settlementService) Withdraw(ctx context.Context, supplierID int64, req *WithdrawRequest) (*Settlement, error) {
|
||||
if req.SMSCode != "123456" {
|
||||
return nil, errors.New("invalid sms code")
|
||||
}
|
||||
|
||||
// 验证金额:必须为正数
|
||||
if req.Amount <= 0 {
|
||||
return nil, errors.New("SUP_SET_4003: withdraw amount must be positive")
|
||||
}
|
||||
|
||||
balance, err := s.store.GetWithdrawableBalance(ctx, supplierID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -192,7 +206,7 @@ func (s *settlementService) Withdraw(ctx context.Context, supplierID int64, req
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.auditStore.Emit(ctx, audit.Event{
|
||||
s.emitAudit(ctx, audit.Event{
|
||||
TenantID: supplierID,
|
||||
ObjectType: "supply_settlement",
|
||||
ObjectID: settlement.ID,
|
||||
@@ -221,7 +235,7 @@ func (s *settlementService) Cancel(ctx context.Context, supplierID, settlementID
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.auditStore.Emit(ctx, audit.Event{
|
||||
s.emitAudit(ctx, audit.Event{
|
||||
TenantID: supplierID,
|
||||
ObjectType: "supply_settlement",
|
||||
ObjectID: settlementID,
|
||||
|
||||
Reference in New Issue
Block a user