EdgeChat权限系统源码解析:基于用户组的21项权限RBAC设计
【免费下载链接】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),仅供参考

相关新闻

Agent Harness与AI自我改进的讨论:把settings改到TaoToken,解锁AI自主进化的底层基础机制

Agent Harness与AI自我改进的讨论:把settings改到TaoToken,解锁AI自主进化的底层基础机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 15:55:17 阅读更多 →
MATLAB系统辨识实战包:电机建模、传感器数据接入与闭环反推

MATLAB系统辨识实战包:电机建模、传感器数据接入与闭环反推

简介:本资源是一套面向自动化、控制工程专业高年级本科生及研究生的系统辨识实践教学材料,聚焦MATLAB在动态系统建模与参数估计中的工程落地。资源涵盖数据预处理、ARX/NARMAX/状态空间等主流模型构建、n4sid/arx等核心函数调用、模型验证(co…

2026/10/17 15:55:17 阅读更多 →
XGBoost入门教程:从梯度提升原理到Python实战预测

XGBoost入门教程:从梯度提升原理到Python实战预测

简介:《XGBoost with Python》是Jason Brownlee推出的英文原版经典教材,专注于梯度提升树与XGBoost的实际应用,目标读者是已具备Python和机器学习基础、想在实战中高效建模的数据分析师或研究者。资源为单个PDF文档,大小约1.19MB&…

2026/10/17 15:54:16 阅读更多 →

最新新闻

PDF处理工具开发实战:压缩、合并与元数据清洗的踩坑记录

PDF处理工具开发实战:压缩、合并与元数据清洗的踩坑记录

1. 名字叫 colibri 的 PDF 工具,我是怎么被它逼疯又治好的先交代背景。colibri 是西班牙语和法语里"蜂鸟"的意思,长周末我给自己挖了一个坑:做一个极轻量的 PDF 处理工具,核心就三件事——压缩、拆分合并、清洗元数据。…

2026/10/17 20:12:19 阅读更多 →
UGUI性能优化:深入解析Graphic渲染机制与重建陷阱

UGUI性能优化:深入解析Graphic渲染机制与重建陷阱

1. 从一次UI卡顿排查说起:Graphic到底管了什么几个月前帮一个朋友看他们团队做的一个移动端项目,场景不复杂,就是一个列表页里塞了几十个带图标和文字的条目,滚动起来却明显掉帧。他们一开始怀疑是布局重建太频繁,又怀…

2026/10/17 20:12:19 阅读更多 →
量子机器学习入门:从量子比特到参数化量子线路

量子机器学习入门:从量子比特到参数化量子线路

最近半年,我被问到最多的一句话就是:量子机器学习到底该怎么入门?比起直接啃论文,很多人第一步就卡在量子计算基础上。叠加、纠缠、量子门、测量,这些词每个都眼熟,合在一起就懵了。这篇文章就当一份“抢救…

2026/10/17 20:12:19 阅读更多 →
国产化 Codex 智能体实战:自主指令拆解与技能自学习配置大纲

国产化 Codex 智能体实战:自主指令拆解与技能自学习配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 20:12:19 阅读更多 →
平面四边形单元有限元实现:从等参变换到刚度矩阵组装

平面四边形单元有限元实现:从等参变换到刚度矩阵组装

前几篇笔记我把平面三角形单元撸了一遍,今天轮到平面四边形单元。很多初学者会有个错觉,觉得三角形单元既然能剖分任意形状,那为什么还要折腾四边形?等你真正去算一个带转角的悬臂梁、一个孔边应力集中的平板,或者网格…

2026/10/17 20:11:18 阅读更多 →
QDA二次判别分析:从协方差矩阵差异到非线性决策边界

QDA二次判别分析:从协方差矩阵差异到非线性决策边界

之前在某图像处理Demo里做缺陷样本分类,特征只有四个,类别只有两类。最初顺手用线性判别分析(LDA)跑了一版,训练集和测试集的准确率卡在82%上下,怎么调都上不去。后来把每个类别的协方差矩阵拆开单独估计&a…

2026/10/17 20:11:18 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →