news 2026/10/15 8:06:58

DooTask 机器人权限指南:所有权校验、系统机器人限制与常见报错排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DooTask 机器人权限指南:所有权校验、系统机器人限制与常见报错排查
  • 后端
  • 前端
  • 协同办公
  • 即时通讯
  • 企业应用

【免费下载链接】dootask

DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。

项目地址:https://gitcode.com/gh_mirrors/do/dootask
点击查看免费下载

DooTask 的机器人(bot)是一类特殊的用户账号,其查看、编辑、删除权限由后端按「所有权 + 类型」两重维度硬性校验:自建机器人只认创建者本人,系统机器人只认管理员且不可删除。本文基于源码接口(bot__info/bot__edit/bot__delete)逐条拆解权限判定逻辑,并给出「不是你的机器人」「权限不足」「系统机器人不能删除」「超过最大创建数量」等高频报错的完整排查与解决路径,读完即可独立完成机器人权限问题的定位与处理。

一、先建立权限模型:机器人分三类,权限只有两层

DooTask 把机器人分为三类(详见 机器人是什么):

类型邮箱特征谁能操作
内置系统机器人以@bot.system结尾,名称在白名单内普通用户只能使用;仅系统管理员(userIsAdmin)可改昵称/头像;任何人都不能删除
用户自建机器人邮箱前缀为user-normal-/user-session-,如user-normal-xxxx@bot.system只有创建者(主人)本人可查看 / 改 / 删
Webhook 接入自建机器人配置webhook_url后具备的扩展能力归属权随自建机器人

虽然类型有三类,但权限校验实际只有两层:

  • 自建机器人 → 主人:user_bots.userid必须与当前登录用户一致;
  • 系统机器人 → 管理员:凭User::isAdmin()判断,普通成员看得到但所有写操作都会被拦。

官方 FAQ 明确强调:没有「全局机器人管理员」角色,只有上述两层;且机器人权限由后端硬性判断,前端隐藏按钮不等于绕过校验——直接调用接口同样会被拦截。

二、后端校验入口:三个接口共享同一套判定逻辑

机器人相关接口集中在 app/Http/Controllers/Api/UsersController.php,分别是:

接口方法作用
api/users/bot/infobot__info获取机器人信息
api/users/bot/editbot__edit添加 / 编辑机器人
api/users/bot/deletebot__delete删除机器人

三个接口的权限判定模式完全一致,核心逻辑如下(以bot__delete为例):

$botUser = User::whereUserid($botId)->whereBot(1)->first(); if (empty($botUser)) { return Base::retError('机器人不存在'); } // 查「当前用户 × 该机器人」的归属记录 $userBot = UserBot::whereBotId($botUser->userid)->whereUserid($user->userid)->first(); if (empty($userBot)) { if (UserBot::systemBotName($botUser->email)) { // 系统机器人(仅限管理员) return Base::retError('系统机器人不能删除'); } else { // 其他用户的机器人(仅限主人) return Base::retError('不是你的机器人'); } }

判定顺序值得注意:

  1. 先按user_bots表查「当前用户与该机器人」的归属记录;
  2. 若查不到归属记录,再判断它是不是系统机器人:
    • 是系统机器人 → 非管理员报「权限不足」(info/edit)或「系统机器人不能删除」(delete);
    • 非系统机器人 → 说明是别人的自建机器人,一律报「不是你的机器人」,连管理员也无法直接接管他人机器人。

bot__info与bot__edit对该分支的处理略有差异:info 和 edit 对系统机器人报「权限不足」,delete 对系统机器人报「系统机器人不能删除」——这是因为系统机器人本就不该被删除。

三、系统机器人的识别:白名单在UserBot::systemBotName

后端通过 app/Models/UserBot.php 的两个静态方法识别系统机器人:

  • isSystemBot($email):邮箱以@bot.system结尾,且前缀命中白名单;
  • systemBotName($name):systemBotName 用match表达式维护了一张写死的白名单,返回中文显示名,未命中返回空字符串。

当前白名单(v1.7.90 版本源码确认)包括:

通知/提醒类:system-msg(系统消息)、task-alert(任务提醒)、todo-alert(待办提醒)、meeting-alert(会议通知)、okr-alert(OKR 提醒)、approval-alert(审批)

互动/办公类:check-in(签到打卡)、anon-msg(匿名消息)、bot-manager(机器人管理)

AI 对话类:ai-openai(ChatGPT)、ai-claude(Claude)、ai-deepseek(DeepSeek)、ai-gemini(Gemini)、ai-grok(Grok)、ai-ollama(Ollama)、ai-zhipu(智谱清言)、ai-qianwen(通义千问)、ai-wenxin(文心一言)、ai-dooai(Doo AI)

完整清单与依赖说明见 内置系统机器人有哪些。从源码结构可以推断:这套白名单决定了「系统机器人名单写死、不支持自助新增类型」,普通用户既无法创建同名机器人,也无法删除或自定义其行为。

四、自建机器人的硬性约束:50 个上限 + 2-20 字符名称

创建自建机器人的校验在 UserBot::newBot,两条硬性规则:

  1. 数量上限 50:统计user_bots表中该userid名下机器人数量,>= 50即返回「超过最大创建数量。」;
  2. 名称长度:机器人名strlen小于 2 或大于 20 字符,返回「机器人名称由2-20个字符组成。」。

创建成功后,newBot还会自动为创建者建立与机器人的单聊会话(WebSocketDialog::checkUserDialog),并在会话中发送一条创建成功。的模板消息;若开启了会话功能(sessionSupported),还会额外创建一条web_socket_dialog_sessions会话记录。

五、报错排查与解决路径

5.1「不是你的机器人」

  • 含义:当前账号不是该自建机器人的创建者(主人)。
  • 来源:bot__info/bot__edit/bot__delete中user_bots.userid != 当前用户且非系统机器人。
  • 解决:用创建者本人账号登录,在「我的机器人」列表操作;DooTask没有机器人过户功能,想接管他人机器人只能让原主人通过/token指令取走凭证后给你,由你以该凭证驱动机器人(机器人自身归属不变)。

5.2「权限不足」

  • 含义:试图以非管理员身份修改系统机器人(昵称、头像)。
  • 来源:bot__info/bot__edit中对系统机器人分支调用$user->isAdmin()失败。isAdmin()的实现是检查身份数组中是否含admin(见 User::isAdmin)。
  • 解决:普通成员对系统机器人「看得到、改不了」,所有写操作都会被拦;请把需求转给系统管理员处理。

5.3「系统机器人不能删除」

  • 含义:系统机器人被写死为不可删除,任何人(含管理员)都不能删。
  • 来源:bot__delete中对系统机器人分支的硬编码返回。
  • 解决:不要尝试删除,系统机器人是平台功能依赖的组成部分;如需隐藏或停用,从系统设置层面处理(如关闭对应插件),而不是删除账号。

5.4「超过最大创建数量」

  • 含义:当前账号名下自建机器人已达 50 个上限。
  • 来源:UserBot::newBot的count() >= 50前置检查。
  • 解决:先删掉一些不再使用的机器人腾出名额。注意删除是不可逆操作,删除前请确认。

5.5「机器人名称由2-20个字符组成」

  • 含义:名称长度不合法。
  • 来源:UserBot::newBot与/setname指令共用同一条规则。
  • 解决:将名称控制在 2-20 个字符之间重试。

5.6「机器人不存在」/「删除失败」

  • 含义:whereBot(1)查不到该 ID,或deleteUser事务执行失败。
  • 解决:确认机器人 ID 正确且未被删除;删除失败通常意味着事务回滚,可从服务端日志定位具体异常。

六、删除流程详解:备注必填,事务内多表清理

删除接口api/users/bot/delete的入参为:

参数类型说明
idNumber机器人 ID
remarkString删除备注,必填,≤ 255 字符

源码中的前置校验(bot__delete):

  • remark为空 → 「请输入删除备注」;
  • mb_strlen(remark) > 255→ 「删除备注长度限制255个字」;
  • 随后才进入上面的所有权/类型判定。

通过校验后调用 User::deleteUser,整个删除流程在数据库事务中执行:

  1. 写入user_deletes表(记录操作者、被删机器人 ID、邮箱、备注、缓存快照),作为可追溯的删除原因;
  2. 删除该机器人账号的未读消息(web_socket_dialog_msg_reads)与待办(web_socket_dialog_msg_todos)等关联数据;
  3. 删除邮箱验证记录(user_email_verifications);
  4. 删除机器人用户本身。

因此文档所述「机器人删除会同时清掉关联会话」在实现上体现为:删除动作会在事务内连带清理该账号的未读、待办等消息关联数据,避免留下孤儿记录。

七、用斜杠指令管理机器人:/list、/newbot、/token等

通过单聊「机器人管理」(bot-manager@bot.system)可以直接用斜杠指令管理自建机器人,指令分发实现在 app/Tasks/BotReceiveMsgTask.php:

指令作用备注
/list列出我拥有的机器人仅限「机器人管理」机器人使用,take(50)与数量上限一致
/newbot 名称新建机器人走UserBot::newBot,同样受 50 上限与名称长度限制
/setname [ID] 名称修改昵称名称长度校验同创建
/token获取机器人 Token拿到后可在外部系统代发消息
/revoke更新(作废)Token重新生成密码,旧 Token 失效
/deletebot删除机器人调用deleteUser('delete bot')
/clearday设置消息保留天数1-999,默认 30
/webhook设置 Webhook 地址≤ 255 字符
/dialog搜索该机器人的会话返回前 20 条

/list与/newbot被硬性限制为仅能通过「机器人管理」机器人触发(源码!$isManager && in_array($type, ['/list', '/newbot'])直接 return);其余指令若由用户直接对自建机器人发送,则默认针对该机器人本身。每个指令最终都会经getBotInfo($botId, $userid)(源码实现)按bot_id + userid双重条件查询归属,查不到归属记录的请求一律按「机器人不存在」处理——这再次印证了所有权校验的前置地位。

八、FAQ 速查表

报错信息触发场景处理方式
不是你的机器人操作他人的自建机器人换创建者账号;或让原主人用/token取凭证给你
权限不足非管理员改系统机器人联系系统管理员
系统机器人不能删除删除系统机器人不可删除,从设置/插件层面处理
超过最大创建数量名下自建机器人 ≥ 50先删除不用的机器人
机器人名称由2-20个字符组成名称长度不合法修改为 2-20 字符
请输入删除备注 / 删除备注长度限制255个字删除时备注缺失或超长填写 ≤255 字符备注
机器人不存在ID 无效或已删除核对 ID

相关阅读

  • 机器人是什么:三类机器人与关键属性
  • 内置系统机器人清单与依赖插件
  • 自建机器人的 Webhook 接入
  • 删除流程对应后端接口api/users/bot/delete
  • 后端
  • 前端
  • 协同办公
  • 即时通讯
  • 企业应用

【免费下载链接】dootask

DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。

项目地址:https://gitcode.com/gh_mirrors/do/dootask
点击查看免费下载

相关推荐

上一篇:UniProton API完全指南:从基础函数到高级功能的实战应用 🚀
下一篇:Protractor 快速入门:安装、首个 E2E 测试与 Spec/Config 文件实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 8:06:44

二叉树中序遍历算法详解与性能对比

1. 二叉树中序遍历基础概念中序遍历是二叉树遍历的三种基本方式之一,其核心规则可以概括为"左-根-右"的访问顺序。具体来说,就是先递归遍历左子树,然后访问根节点,最后递归遍历右子树。这种遍历方式特别适合需要按节点值…

作者头像 李华
网站建设 2026/10/15 8:06:18

SpringBoot智慧社区物业管理系统设计与实践

1. 项目概述:智慧社区物业管理系统设计这个基于SpringBoot的物业管理系统是我去年带队完成的一个企业级项目,主要解决传统物业管理中人工操作效率低、信息孤岛严重的问题。系统上线后帮助某中型社区将投诉处理时间从平均72小时缩短到8小时以内&#xff0…

作者头像 李华
网站建设 2026/10/15 8:06:17

外卖小程序源码实战:AI评论识别与微信支付全链路解析

简介:这是一套基于uniapp开发的美团外卖微信小程序实战源码,面向希望掌握小程序全栈开发与AI应用的学生及进阶开发者,可作为课程设计、毕业设计或项目立项的参考。项目覆盖商家店铺商品列表、授权登录、微信支付等核心电商流程,并…

作者头像 李华
网站建设 2026/10/15 8:06:12

AnythingLLM:基于SQLite的本地优先AI Agent工作区实践

1. 项目概述:为什么 AnythingLLM 不只是“另一个本地 ChatGPT”?AnythingLLM 这个名字听起来像极了“什么都能聊”的轻量版 ChatGPT,但如果你真把它当成一个带 UI 的 Ollama 前端,那大概率会在第三天就删掉它——不是不好用&#…

作者头像 李华
网站建设 2026/10/15 8:06:08

artcraft创作工具定位与手工项目工作流搭建指南

1. 从"artcraft"这个名字说起:一个被低估的创作工具定位问题第一次看到"artcraft"这个标题的时候,我脑子里冒出来的第一个念头是:这到底是一个艺术创作工具,还是一个手工艺平台?名字本身把"a…

作者头像 李华