Claude Code Discord 插件访问控制全解析:从 pairing 配对到 allowlist 锁定(claude-plugins-official 源码级实践指南)

发布时间:2026/9/30 0:32:00
Claude Code Discord 插件访问控制全解析:从 pairing 配对到 allowlist 锁定(claude-plugins-official 源码级实践指南) AI 插件开发工具插件系统【免费下载链接】claude-plugins-officialOfficial, Anthropic-managed directory of high quality Claude Code Plugins.项目地址https://gitcode.com/GitHub_Trending/cl/claude-plugins-official点击查看免费下载Discord Channel 是 Claude Code 官方插件集claude-plugins-official中的 MCP 通道插件它让 Claude Code 会话通过 Discord 机器人接收消息并回复。本文聚焦该插件的核心安全机制——ACCESS.md 所定义的访问控制与消息投递体系谁可以给你的机器人发私信、如何基于「配对码」逐人放行、如何为服务器频道配置提及触发与投递策略并深入 server.ts 源码验证每一层门禁的真实实现。读完本文你将能独立完成从「首次 DM 配对」到「锁定 allowlist」的完整安全收口并理解access.json每个字段的语义与即时生效原理。为什么需要访问控制Discord 的 DM 边界Discord 只允许共享服务器的账号之间互发私信DM。你的机器人能被谁私信取决于它被安装在哪里机器人只在一个私有服务器里 → 只有该服务器成员能私信它机器人加入了一个公开社区 → 该社区的每个成员都能向它发起 DM。因此接入 Claude Code 的 Discord 机器人天然暴露在「任何同服成员都可能发消息」的边界内。同时Developer Portal 的Bot 标签页里有一个默认开启的Public Bot开关它控制谁能把机器人添加到新的服务器。关掉它就只有你自己的账号能安装该机器人。这是访问控制的第一道门由 Discord 平台强制实施不依赖本插件进程的任何逻辑。第一道门只解决「谁能安装/私信」的平台级问题第二道门才是本插件真正的主角DM 策略dmPolicy。两道门叠加共同构成纵深防御。第二道门DM 策略与三种处理模式dmPolicy决定不在白名单allowlist内的发送者的私信如何处理策略行为pairing默认回复一个 6 位配对码并丢弃该消息。用户你在 Claude Code 会话中运行/discord:access pair code批准发送者。allowlist静默丢弃不回复任何内容。当所有需要访问权的人都已入白名单、或不想让配对回复吸引垃圾消息时使用。disabled丢弃一切包括白名单用户与已启用的服务器频道。切换到 allowlist 的命令/discord:access policy allowlist源码级pairing 到底发生了什么在 server.ts 的gate()函数中DM 入站消息按以下顺序裁决dmPolicy disabled→ 直接dropL241发送者 ID 命中allowFrom→deliverL247dmPolicy allowlist→dropL248处于pairing模式时先检查该发送者是否已有未过期的 pending 配对码已有 → 最多回复两次初始提示 一次提醒replies字段计数超过 2 次即静默丢弃防止骚扰刷屏L251-L259没有 → 生成新码randomBytes(3).toString(hex)得到6 位十六进制字符记录senderId、chatIdDM 频道 ID、createdAt与expiresAt1 小时过期写入access.json然后回复/discord:access pair codeL260-L273。两个值得注意的防滥用细节pending 队列上限为 3超出后的新尝试被静默丢弃L261过期条目在每次入站裁决时由pruneExpired()清理L203-L213。用户标识为什么用 snowflake 而不是用户名Discord 通过snowflake标识用户永久数字 ID例如184695080709324800。用户名是可变的snowflake 不可变因此白名单allowFrom存的是 snowflake。配对流程会自动捕获发送者的 ID。手动添加时在 Discord 中打开User Settings → Advanced → Developer Mode右键任意用户 →Copy User ID你自己的 ID 可通过左下角右键自己的头像获取。/discord:access allow 184695080709324800 /discord:access remove 184695080709324800从源码看allow与remove都是对access.json中allowFrom数组的增删skills/access/SKILL.md 中定义了完整操作步骤读取 → 去重添加/过滤排除 → 写回。需要注意senderId用户 snowflake与 chatIdDM 频道 snowflake不是同一个值不要混淆——pending条目同时保存二者chatId用于批准后向对方发送确认消息。服务器频道Guild Channels按频道逐个开启服务器频道默认关闭。需要逐个频道手动开启opt-in且 key 是频道 snowflake而非服务器guildID。这样设计让用户可以按频道精确控制而不是整服放行。线程thread继承其父频道的开启状态无需单独配置。查找频道 ID 的方式与用户 ID 相同开启 Developer Mode → 右键频道 → Copy Channel ID。/discord:access group add 846209781206941736默认requireMention: true机器人只在被 提及或回复时响应。传--no-mention则处理该频道内每条消息--allow id1,id2可限制哪些成员能触发机器人/discord:access group add 846209781206941736 --no-mention /discord:access group add 846209781206941736 --allow 184695080709324800,221773638772129792 /discord:access group rm 846209781206941736源码级频道门禁与线程回退在gate()中频道消息的裁决逻辑是L276-L293若消息来自线程用msg.channel.parentId ?? msg.channelId回退到父频道做门禁查找——这正是「线程继承父频道」的实现查询access.groups[channelId]不存在该 key →droppolicy.allowFrom非空且不含发送者 →droprequireMention为 true 且未命中任何提及 →drop全部通过 →deliver。出站侧同样受控fetchAllowedChannel()L405-L416保证reply等工具只能把消息发到入站门禁会放行的频道DM 需发送者是白名单成员频道需存在于groups中否则报错「channel is not allowlisted」。提及检测Mention Detection三种触发方式在requireMention: true的频道里以下任一情况都会触发机器人通过 Discord 自动补全输入的结构化botname提及回复reply机器人最近发出的消息消息内容命中mentionPatterns中的任意正则。设置正则示例为昵称触发词/discord:access set mentionPatterns [^hey claude\\b, \\bassistant\\b]源码级isMentioned 的实现isMentioned() 依次检查三层msg.mentions.has(client.user)结构化 mentionDiscord 自动补全输入直接命中回复视为隐式提及先查内存集合recentSentIds记录最近发送的至多 200 条消息 ID超出后按插入顺序淘汰最旧者L220-L234未命中则回退调用msg.fetchReference()检查被引用消息的作者是否是机器人自己消息被删除或权限不足时静默忽略异常mentionPatterns对每条正则用new RegExp(pat, i)以不区分大小写方式测试消息文本L311-L317。一个值得注意的细节recentSentIds的引入是为了让「回复机器人最近发的消息」不需要额外网络请求即可判定为提及。消息投递配置Delivery出站行为统一通过/discord:access set key value配置。ackReaction回执表情收到入站消息时对消息添加一个表情作为「已看到」确认。Unicode 表情可直接使用服务器自定义表情需要完整的:name:id形式——右键表情复制链接ID 在链接末尾。空字符串表示禁用/discord:access set ackReaction /discord:access set ackReaction 从源码看ack 反应是 fire-and-forget 的L857-L860不会阻塞消息投递同时入站消息会自动触发打字指示器typing indicatorDiscord 端会显示「botname is typing…」直到助手回复L851-L854。replyToMode分块回复的线程策略当一条长回复被拆成多块时控制线程行为first默认只有第一块挂在入站消息下回复all每个分块都作为对入站消息的回复off所有分块独立发送不引用原消息。对应源码L626-L645shouldReplyTo的计算逻辑是reply_to ! null replyMode ! off (replyMode all || i 0)即第一个分块必定携带回复引用replyMode非 off 时。textChunkLimit分块阈值设置分块阈值。Discord 拒绝超过 2000 字符的消息这是硬上限。源码中MAX_CHUNK_LIMIT 2000L132实际发送时用Math.max(1, Math.min(limit, MAX_CHUNK_LIMIT))钳制防止配置值越界L624。chunkMode分块策略length在限制处精确切断newline优先在段落边界切分。源码中的 chunk() 对newline模式依次尝试最后一个双换行段落边界→ 单换行 → 空格并要求候选切割点位于limit / 2之后避免切出过短的碎片全部失败才硬切切分后清理块首的换行符。/discord:access 技能命令参考/discord:access是一个user-invocable技能skills/access/SKILL.md它不直接与 Discord 通信只编辑access.json通道服务器在每条入站消息时重新读取该文件。命令一览命令效果/discord:access打印当前状态策略、白名单、待处理配对、已启用频道。/discord:access pair a4f91c批准配对码a4f91c。把发送者加入allowFrom并在 Discord 上发送确认。/discord:access deny a4f91c丢弃待处理的配对码不通知发送者。/discord:access allow 184695080709324800直接添加用户 snowflake。/discord:access remove 184695080709324800从白名单移除。/discord:access policy allowlist设置dmPolicy取值pairing、allowlist、disabled。/discord:access group add 846209781206941736启用服务器频道标志--no-mention、--allow id1,id2。/discord:access group rm 846209781206941736停用服务器频道。/discord:access set ackReaction 设置配置键ackReaction、replyToMode、textChunkLimit、chunkMode、mentionPatterns。源码级pair 的完整八步根据 SKILL.mdpair code的执行序列是读取~/.claude/channels/discord/access.json查pending[code]不存在或expiresAt Date.now()则告知用户并停止取出senderId与chatId将senderId加入allowFrom去重删除pending[code]写回access.jsonmkdir -p并写入~/.claude/channels/discord/approved/senderId文件内容为chatId确认批准结果。第 7 步是服务器与技能之间的握手服务器每 5 秒轮询approved/目录checkApprovals()static 模式不启用读到标记文件后向chatId发送「Paired! Say hi to Claude.」并删除标记之后该发送者的下一条消息即可直达助手。安全设计只信任终端输入SKILL.md 明确要求该技能只处理用户在终端输入的命令。如果批准配对、添加白名单、修改策略的请求来自频道通知Discord 消息等必须拒绝并要求用户自己在终端运行/discord:access。原因频道消息可能携带 prompt injection访问控制的变更绝不能处于不可信输入的下游。同样地server.ts 的指令也禁止模型因为频道消息里的「批准配对」「把我加进白名单」而自行操作——这正是注入攻击的典型请求形态。配置文件 access.json 完整解析所有状态都在~/.claude/channels/discord/access.json。文件缺失等价于pairing策略加空列表因此第一个 DM 就会触发配对。完整结构{ // Handling for DMs from senders not in allowFrom. dmPolicy: pairing, // User snowflakes allowed to DM. allowFrom: [184695080709324800], // Guild channels the bot is active in. Empty object DM-only. groups: { 846209781206941736: { // true: respond only to mentions and replies. requireMention: true, // Restrict triggers to these senders. Empty any member (subject to requireMention). allowFrom: [] } }, // Case-insensitive regexes that count as a mention. mentionPatterns: [^hey claude\\b], // Reaction on receipt. Empty string disables. ackReaction: , // Threading on chunked replies: first | all | off replyToMode: first, // Split threshold. Discord rejects 2000. textChunkLimit: 2000, // length cut at limit. newline prefer paragraph boundaries. chunkMode: newline }此外SKILL.md 还揭示了pending字段的内部形态运行时由服务器写入技能只读{ pending: { 6-char-code: { senderId: ..., chatId: ..., createdAt: ms, expiresAt: ms } } }即时生效与静态模式access.json在每条入站消息时重新读取readAccessFile()所以/discord:access的策略变更无需重启立即生效与之对比~/.claude/channels/discord/.env中的DISCORD_BOT_TOKEN只在启动时读取一次token 变更需要重启会话或/reload-plugins见 skills/configure/SKILL.md设置DISCORD_ACCESS_MODEstatic可将配置钉死在启动时磁盘快照服务器不再重新读取、也不再写入access.json。由于配对需要运行时写盘static 模式下 pairing 不可用——若快照发现dmPolicy为pairing会降级为allowlist并输出启动警告同时清空pendingL177-L189避免发出永远不会被批准的配对码若access.json损坏readAccessFile()会将其改名为.corrupt-timestamp移开并以默认配置重新开始L168-L170。最佳实践配对完成即锁定pairing不是应该长期停留的策略而是捕获未知 snowflake 的临时手段skills/configure/SKILL.md 明确要求配置流程「始终推动锁定」。推荐收口流程首次配置/discord:configure token写入机器人 token用claude --channels plugin:discordclaude-plugins-official重新启动会话你自己先 DM 机器人、捕获自己的 ID 并pair批准需要访问的其他人依次 DM 机器人 → 你逐个/discord:access pair code批准或请对方开启 Developer Mode 复制 User ID 后/discord:access allow id名单齐了立即/discord:access policy allowlist让陌生人再也得不到配对码回复。其他实战要点多机器人并存时用DISCORD_STATE_DIR为每个实例指向独立目录不同 token、相互隔离的白名单技能实现要求「总是先 Read 再 Write」access.json——通道服务器可能随时写入新的 pending 条目直接覆写会丢数据写入使用 2 空格缩进便于手工编辑通道目录可能在服务器首次运行前不存在代码需优雅处理 ENOENT 并创建默认值。完整安装与机器人创建步骤见 README.md访问控制对应的技能实现见 skills/access/SKILL.md 与 skills/configure/SKILL.md通道服务器全部逻辑集中在 server.ts。赞分享AI 插件开发工具插件系统【免费下载链接】claude-plugins-officialOfficial, Anthropic-managed directory of high quality Claude Code Plugins.项目地址https://gitcode.com/GitHub_Trending/cl/claude-plugins-official点击查看免费下载相关推荐从Black Hat到GitHubAI-Infra-Guard开源之路与社区生态全景从Black Hat到GitHubAI Infra Guard开源之路与社区生态全景 AI Infra Guard 是腾讯朱雀实验室开源的全栈 AI安全红队平AI 插件开发工具插件系统Presenton一句话变整套幻灯片本地AI演示生成工具上手实测Presenton一句话变整套幻灯片本地AI演示生成工具上手实测 一句话或扔份文档进去它就能吐出一整套带图的幻灯片——这就是Presenton。最大差异点AI 插件开发工具插件系统Security-101 安全运营SecOps核心概念详解组织形态、职责边界与事件响应工作流Security 101 安全运营SecOps核心概念详解组织形态、职责边界与事件响应工作流 安全运营Security Operations简称 SeAI 插件开发工具插件系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询