【免费下载链接】Edgechat完全运行于 Cloudflare Worker的现代聊天系统实时通信、Telegram 双向桥接、消息与文件加密 A modern, self-hosted team chat built on Cloudflare — realtime messaging, Telegram bridge, encrypted messages files, and WebMCP. |项目地址https://gitcode.com/gh_mirrors/ed/Edgechat点击查看免费下载EdgeChat 是一套完全运行于 Cloudflare Worker 的现代自托管聊天系统支持实时通信、Telegram 双向桥接与消息文件加密。它的后台权限系统RBAC基于用户组划分系统内置 21 个稳定的权限 key按模块勾选、依赖联动、范围受限并通过数据库触发器兜底杜绝了管理员身份万能放行的旧模式。本文带你逐层拆解 EdgeChat 权限系统的源码设计与关键实现。整体架构用户组、超管与 21 项权限三大基石EdgeChat 的后台身份模型刻意保持简单官方文档 docs/rbac.md 概括为三条规则概念来源说明用户组rbac_roles表后台权限组与聊天群组无关每人一组无继承、叠加超级管理员users.is_super_admin独立字段组名或全选权限都不能产生超管普通组id1 的固定组无任何后台权限受数据库触发器保护不可修改后台界面长这样——左侧导航栏中的每个入口都对应一组权限 key这种设计的核心收益是普通聊天功能完全不加载后台权限集合聊天路径的性能与攻击面都不受 RBAC 影响。21 项权限 key 清单前后端共用一份定义全部权限定义集中在 shared/admin-permissions.ts前后端共用同一份数组每项包含 key、所属模块、名称、说明、依赖权限和风险等级模块权限 key说明dashboarddashboard.read查看仪表盘仅聚合数量和状态usersusers.read查看用户基础资料与账号状态usersusers.create创建普通账号依赖users.readusersusers.profile.update编辑未受保护用户的显示名usersusers.ban封禁和解封未受保护普通用户usersusers.delete删除用户高风险usersusers.login_history.read查看登录记录敏感invitesinvites.read/invites.create/invites.revoke查看、创建、撤销注册邀请channelschannels.read/channels.delete群组清单、删除群组高风险storagestorage.read/storage.scan存储统计与扫描单用户限速sitesite.read/site.appearance.update站点外观查看与修改telegramtelegram.read/telegram.mappings.manageTelegram 桥接查看与管理instance_bridgeinstance_bridge.read/instance_bridge.manage实例桥接查看与管理maintenancemaintenance.read查看健康摘要脱敏状态两个值得注意的机制依赖联动togglePermissionshared/admin-permissions.ts保证勾选写权限自动带上读取依赖取消读取则同时取消所有依赖它的权限——前端勾选与后端校验执行的是同一套规则不存在界面上能勾、后端不认的情况。风险标注users.delete、channels.delete、telegram.mappings.manage等标记为high风险users.login_history.read标记为sensitive用于在管理界面上提示操作者。接口策略集中登记未知路由默认拒绝worker/src/rbac/policies.ts 中登记了 38 条后台接口策略ADMIN_POLICIES每条策略声明HTTP method 路径正则 所需权限 字段白名单 目标范围user/group/telegram/bridge 是否写入审计日志。三个精巧的设计点1. 字段级权限判定。users.update策略本身不声明固定权限而是由resolvePolicyworker/src/rbac/policies.ts根据请求体里实际出现的字段动态追加只改displayName需要users.profile.update只封禁需要users.ban两者都不具备则直接 400没有可修改的字段。2. 字段白名单防提权。中间件会校验请求体中是否存在策略未声明的字段注入isAdmin、is_super_admin、permissions等字段会被直接拒绝400从入口堵住参数注入提权。3. 超管专属接口显式声明。重置他人密码、配置 Bot Token、管理用户组本身、查看审计日志等敏感操作都标记superOnly: true子管理员一律 403。授权核心SQL 断言 事务内复验worker/src/rbac/authorization.ts 是整个 RBAC 的权威实现分为三层身份快照authorizationFromRow每个后台请求实时从 D1 主库读取身份不缓存跨请求的允许决策。超管判定是双条件is_super_admin1且role_id1——即使有人误改组数据只要不满足双条件就不会意外获得全量权限普通组的权限还会过滤掉未知 key 和缺少依赖的组合。SQL 断言policyAssertion把这个用户有这个操作权限、且目标在其管理范围内翻译成一条可嵌入 SQL 的EXISTS子句。范围限制在这里体现得很直接——子管理员操作用户范围时目标必须是未删除、非超管、未被管理保护的账号操作群相关资源时必须是目标群的 owner-- 子管理员的群范围限制policy.scopegroup 时生成 EXISTS (SELECT 1 FROM channel_members cm WHERE cm.channel_id ? AND cm.user_id u.id AND cm.role owner)事务内复验runAuthorizedBatch这是最硬核的一层。所有写操作通过authorizedDatabase包装器自动注入同事务复验——先向admin_write_guard表插入一行断言结果CHECK 约束要求ok1才能通过断言失败、业务语句失败、审计写入失败整个 D1 batch 原子回滚。即使请求预检通过了只要权限在写事务提交前被撤销写入依然会被数据库层拒绝。错误处理同样细致断言失败但extra条件不满足时返回 409数据已变化提示前端刷新重试纯权限不足返回 403rbac_last_super约束冲突则提示必须保留至少一个有效超级管理员。请求全链路adminMiddleware 五步走worker/src/middleware.js 中的adminMiddleware挂载在所有/api/admin/*路由前worker/src/index.js完整流程为解析策略resolvePolicy按 methodpathpayload 匹配 38 条策略未登记的后台路由直接 403——没有isAdmin兜底分支权限校验checkPolicy逐项校验权限 keysuperOnly接口要求超管身份字段白名单拒绝未声明的写入字段范围预检policyAssertion生成的 SQL 实时查库验证目标范围同时禁止删除/封禁自己写路径换装非 GET 请求把数据库环境替换为authorizedDatabase包装实例后续所有run/batch调用自动携带同事务授权断言。全程不缓存、不信任前端传入的任何身份字段每次请求都从主库取最新状态。数据库触发器最后三道保险丝worker/migrations/2026-10-06-rbac.sql 除了建表还埋了一组数据库层触发器L52-L73即使应用层代码有漏洞也守住底线rbac_default_protected普通组id1禁止修改、删除、添加权限且新建用户触发器自动把新账号划入该组rbac_super_group超管不能被降入普通用户组——超管身份独立于组体系rbac_last_super最后一名有效超管禁止被删除、封禁或降级防止站点失管。审计日志admin_audit_log由每次授权写入自动追加配套的limit_admin_audit触发器确保只保留最近 90 天、约 10000 条记录且不保存凭据和消息正文避免审计表无限膨胀。前后端一套 key页面、按钮、接口三方一致前端授权只有一份轻量映射 frontend/src/authorization.tsPAGE_PERMISSIONS声明每个后台页面需要哪些权限can()直接复用 shared 层的hasPermission判断按钮级操作。效果是子管理员登录后左侧导航只出现有权限的模块firstAdminPage()自动跳转到第一个可访问页面无权限的模块即使手动输入 URL也会被服务端 403 拦截——前端隐藏只是体验服务端才是权威用户组编辑界面 AdminRbacPage.vue 按模块分组展示 21 项权限整组勾选同样复用togglePermission保证依赖一致保存时通过expectedRevision做版本冲突检测409 时要求刷新重确认不自动覆盖。关键设计小结回顾 EdgeChat RBAC 的源码可以提炼出几个对自建权限系统非常有借鉴价值的模式权限定义单点化21 个 key 在 shared/admin-permissions.ts 定义一次前端按钮、页面路由、后端策略全部引用同一来源策略集中登记38 条接口策略只出现在 policies.ts新增功能只需登记目录权限 接口策略 页面关联三处拒绝隐式放行范围写进 SQL子管理员的仅管理未受保护账号、桥接必须群主等边界全部由 policyAssertion 生成的 SQL 条件表达业务代码不再手写管理员 if 分支写事务同库复验admin_write_guard CHECK 约束让预检通过和写入成功之间不存在权限窗口数据库触发器兜底普通组不可改、超管不可降级、最后一名超管不可移除——这三条不依赖任何应用层代码。完整的升级迁移与恢复流程含备份 D1、执行 2026-10-06-rbac 迁移、超管恢复工具见 docs/rbac.md覆盖只读子管理员隔离、字段注入拒绝、全选不产生超管、最后超管保护等场景的回归测试在 test/rbac.test.js可作为验证权限系统正确性的测试范本。赞分享【免费下载链接】Edgechat完全运行于 Cloudflare Worker的现代聊天系统实时通信、Telegram 双向桥接、消息与文件加密 A modern, self-hosted team chat built on Cloudflare — realtime messaging, Telegram bridge, encrypted messages files, and WebMCP. |项目地址https://gitcode.com/gh_mirrors/ed/Edgechat点击查看免费下载相关推荐AdminJS权限系统设计基于RBAC的灵活权限模型AdminJS权限系统设计基于RBAC的灵活权限模型 权限管理的痛点与解决方案 你是否还在为后台系统的权限管理感到头疼当用户规模扩大到数百人时如何避免权限后端低代码老 Mac 装不动最新系统OpenCore Legacy Patcher 四步装机指南老 Mac 装不动最新系统OpenCore Legacy Patcher 四步装机指南 系统更新通知停在你的老 Mac 面前版本不够不再推送。OpenCo桌面应用操作系统固件OpenCopilot权限系统设计基于RBAC模型的完整权限管理指南OpenCopilot权限系统设计基于RBAC模型的完整权限管理指南 OpenCopilot作为一款面向SaaS产品的AI助手工具其权限系统设计直接关系到数AI 应用大模型前端RAG上一篇Modern JavaScript Tutorial 实战手写 debounce 防抖装饰器与 call/apply 调用转发下一篇如何把机器人大脑变成服务OpenDM推理HTTP API与/v1/infer接口完全参考创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考