Skip to content

feat: add DMS IP/CIDR access restriction - #665

Open
LordofAvernus wants to merge 1 commit into
mainfrom
dms/feat-961
Open

feat: add DMS IP/CIDR access restriction#665
LordofAvernus wants to merge 1 commit into
mainfrom
dms/feat-961

Conversation

@LordofAvernus

@LordofAvernus LordofAvernus commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

User description

关联的 issue

https://github.com/actiontech/dms-ee/issues/961

描述你的变更

  • 新增 IP/CIDR 访问白名单持久化与配置 API(读/写权限分离)
  • JWT 前挂载访问限制中间件:注册永不拦、已登记服务 IP 豁免、拒绝返回 HTTP 403
  • 开启开关时校验名单非空且当前客户端 IP 已命中,避免管理员自锁

确认项(pr提交后操作)

Tip

请在指定复审人之前,确认并完成以下事项,完成后✅


  • 我已完成自测
  • 我已记录完整日志方便进行诊断
  • 我已在关联的issue里补充了实现方案
  • 我已在关联的issue里补充了测试影响面
  • 我已确认了变更的兼容性,如果不兼容则在issue里标记 not_compatible
  • 我已确认了是否要更新文档,如果要更新则在issue里标记 need_update_doc


Description

  • 新增 IP/CIDR 访问限制及白名单管理功能

  • 实现前置中间件与 API 接口权限判断

  • 增加业务逻辑及存储层实现白名单规则 CRUD

  • 添加单元测试保障规则校验与代理 IP 检查


Diagram Walkthrough

flowchart LR
  A["API 请求入口"] --> B["访问限制中间件"]
  B --> C["业务逻辑处理"]
  C --> D["存储层规则管理"]
  D --> E["单元测试验证"]
Loading

File Walkthrough

Relevant files
Enhancement
11 files
access_restriction.go
定义访问限制 API 数据结构与请求响应格式                                                                     
+71/-0   
access_restriction.go
实现访问限制中间件及 IP 检查逻辑                                                                             
+67/-0   
dms_controller.go
新增访问限制 API 控制器及 swagger 标注                                                             
+177/-0 
router.go
添加访问限制相关路由映射                                                                                         
+9/-0     
access_restriction.go
新增业务逻辑处理白名单规则与 IP 匹配                                                                         
+272/-0 
proxy.go
扩展代理功能实现注册 IP 校验与删除                                                                           
+55/-0   
access_restriction.go
实现服务层访问限制逻辑并调用业务方法                                                                             
+131/-0 
service.go
集成访问限制业务逻辑到服务初始化                                                                                 
+3/-0     
access_restriction.go
实现访问限制存储层 CRUD 及开关管理                                                                         
+156/-0 
model.go
添加白名单规则数据模型及表映射                                                                                   
+13/-0   
proxy.go
添加代理目标删除接口,更新 IP 豁免逻辑                                                                       
+9/-0     
Tests
2 files
access_restriction_test.go
添加访问限制及规则匹配单元测试                                                                                   
+133/-0 
proxy_access_restriction_test.go
添加代理 IP 豁免功能测试用例                                                                                 
+28/-0   

Persist whitelist rules and enablement, expose configuration APIs,
and enforce access at the API middleware before JWT.
@github-actions

Copy link
Copy Markdown

PR Reviewer Guide 🔍

⏱️ Estimated effort to review: 5 🔵🔵🔵🔵🔵
🧪 PR contains tests
🔒 No security concerns identified
⚡ No major issues detected

@github-actions

Copy link
Copy Markdown

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
刷新更新时戳

建议在更新规则前调用 TouchUpdatedAt(existing) 方法,以确保更新时间字段得到刷新。这样可以避免数据更新时间不一致可能引起的潜在问题。

internal/dms/biz/access_restriction.go [149-155]

 existing.Source = normalized
 existing.Remark = remark
 existing.PolicyType = policy
+TouchUpdatedAt(existing)
 if err := u.repo.UpdateRule(ctx, existing); err != nil {
 	return nil, err
 }
 return u.repo.GetRuleByUID(ctx, uid)
Suggestion importance[1-10]: 7

__

Why: 此建议在更新规则前调用 TouchUpdatedAt(existing) 来刷新 UpdatedAt 字段,有助于确保数据更新时间的一致性,改善了数据的可靠性,但影响相对中等。

Medium
更新数据库时刷新时间

建议在更新数据库记录时,同时更新 updated_at 字段,以确保持久化的更新时间与最新修改保持同步。这可以通过在更新的 map 中添加 "updated_at":
time.Now() 实现。

internal/dms/storage/access_restriction.go [80-84]

 result := tx.WithContext(ctx).Model(&model.AccessWhitelistRule{}).Where("uid = ?", rule.UID).Updates(map[string]interface{}{
 	"source":      rule.Source,
 	"policy_type": rule.PolicyType,
 	"remark":      rule.Remark,
+	"updated_at":  time.Now(),
 })
Suggestion importance[1-10]: 7

__

Why: 通过在更新数据库记录的映射中加入 "updated_at": time.Now(),可以同步持久化更新时戳,提高记录的准确性,此建议具有适中改进效果。

Medium

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants