Skip to content

feat: Support blocking commands in chat message - #477

Open
ziyilin wants to merge 1 commit into
DingTalk-Real-AI:mainfrom
ziyilin:commandPolicy
Open

feat: Support blocking commands in chat message#477
ziyilin wants to merge 1 commit into
DingTalk-Real-AI:mainfrom
ziyilin:commandPolicy

Conversation

@ziyilin

@ziyilin ziyilin commented Apr 16, 2026

Copy link
Copy Markdown

概述

为 DingTalk Connector 插件新增命令策略功能,支持在单聊和群聊中灵活控制用户可使用的命令,增强机器人的安全性和可控性。

解决issue:#549

功能详情

1. 三种策略模式

模式 说明 适用场景
open 允许所有命令(默认) 无限制场景
allowlist 仅允许白名单中的命令 严格限制,只允许特定命令
denylist 禁止黑名单中的命令 宽松限制,只禁用特定命令

2. 配置项说明

群聊命令策略 (commandPolicy)

{
  "commandPolicy": {
    "mode": "allowlist",
    "allow": ["/new", "/reset", "/clear"],
    "deny": ["/tools", "/admin"],
    "blockMessage": "抱歉,该命令已被禁用。如需帮助,请联系管理员。"
  }
}

单聊命令策略 (dmCommandPolicy)

{
  "dmCommandPolicy": {
    "mode": "allowlist",
    "allow": ["/new", "/reset", "/clear"],
    "blockMessage": "抱歉,我目前仅支持以下会话管理命令:\n/new、/reset、/clear"
  }
}

单聊命令白名单 (dmCommandAllowlist)

{
  "dmCommandAllowlist": ["user123", "admin456"]
}
  • 白名单中的用户跳过命令策略检查
  • 适用于管理员或特权用户

3. 配置字段说明

字段 类型 必填 说明
mode string 策略模式:open/allowlist/denylist,默认 open
allow string[] 允许列表(allowlist 模式生效)
deny string[] 禁止列表(denylist 模式生效)
blockMessage string 自定义拦截提示消息

使用场景

场景1:限制群聊只能使用会话管理命令

OpenClaw 配置示例:

{
  "channels": {
    "dingtalk-connector": {
      ...
      "commandPolicy": {
        "mode": "allowlist",
        "allow": ["/new", "/reset", "/clear"],
        "blockMessage": "抱歉,本群仅支持 /new、/reset、/clear 命令,其他功能请联系管理员。"
      }
    }
  }
}

场景2:禁用特定危险命令

OpenClaw 配置示例:

{
  "channels": {
    "dingtalk-connector": {
      ...
      "commandPolicy": {
        "mode": "denylist",
        "deny": ["/tools", "/admin", "/config"],
        "blockMessage": "抱歉,该命令已被管理员禁用。如需帮助,请联系管理员。"
      }
    }
  }
}

场景3:单聊严格限制 + 管理员白名单

完整 OpenClaw 配置示例:

{
  "channels": {
    "dingtalk-connector": {
      ...
      "dmCommandPolicy": {
        "mode": "allowlist",
        "allow": ["/new", "/reset", "/clear"],
        "blockMessage": "抱歉,我目前仅支持以下会话管理命令:\n/new、/reset、/clear\n如需其他帮助,请联系管理员。"
      },
      "dmCommandAllowlist": ["1234567890", "0987654321"]
    }
  }
}

说明:

  • dmCommandAllowlist 中的用户 ID 跳过 dmCommandPolicy 检查
  • 适用于管理员或特权用户,让他们可以使用所有命令


技术实现

核心逻辑

  • 仅过滤命令:只检查以 / 开头的消息,普通消息直接放行
  • 大小写不敏感:命令匹配不区分大小写(/NEW 等同于 /new
  • 默认放行:未配置策略或 modeopen 时,允许所有命令

拦截流程

  1. 接收用户消息
  2. 检查是否为命令(以 / 开头)
  3. 根据策略模式验证命令
  4. 如被拦截,发送拦截提示消息给用户
  5. 终止后续处理

默认配置

// 默认允许的命令
const DEFAULT_ALLOWED_COMMANDS = ['/new', '/reset', '/clear'];

// 默认拦截提示
const DEFAULT_COMMAND_BLOCK_MESSAGE = 
  '抱歉,我目前仅支持以下会话管理命令:\n/new、/reset、/clear\n如需其他帮助,请联系管理员。';

注意事项

  1. 向后兼容:未配置策略时默认 open 模式,不影响现有功能
  2. 白名单优先dmCommandAllowlist 中的用户完全跳过策略检查
  3. 仅拦截命令:普通聊天消息不受策略影响
  4. 拦截提示:被拦截时会主动发送提示消息给用户

支持在单聊和群聊中配置命令策略,限制用户可使用的命令。
包括 allowlist/denylist/open 三种模式,以及白名单绕过机制。
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.

1 participant