news 2026/9/6 20:10:43

WeKnora 文档权限管理实战:一次请求如何走完全程的 RBAC 访问控制与多租户隔离

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WeKnora 文档权限管理实战:一次请求如何走完全程的 RBAC 访问控制与多租户隔离

WeKnora 文档权限管理实战:一次请求如何走完全程的 RBAC 访问控制与多租户隔离

【免费下载链接】WeKnoraOpen-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.项目地址: https://gitcode.com/GitHub_Trending/we/WeKnora

WeKnora 是一个开源 LLM 知识平台,让文档变成可查询的 RAG 知识库。当多个团队共用同一套知识库时,怎么保证"别家的文档绝不可见"?本文跟随一次 HTTP 请求的完整生命周期,拆解 WeKnora 的文档权限管理链路:JWT 与 API Key 双通道认证、空间级 RBAC 访问控制、查询层自动附加 tenant_id 过滤,最后落到多租户数据隔离的令牌回收闭环。

登录发令牌,还是传 API Key:中间件怎么认出你是谁

先看问题。权限系统的第一道关卡不是"你能做什么",而是"你是谁"。WeKnora 里有两类调用方:浏览器里登录的真人,和脚本里拿着密钥的机器。两者的凭据形态完全不同,如果中间件写两套逻辑,路由配置很容易漏。

认证中间件的做法是把识别收敛成三条固定通道,按顺序尝试:

// Auth 中间件:按固定顺序尝试三条通道 if isNoAuthAPI(path, method) { c.Next(); return } // 登录、注册等白名单接口 if user, err := userService.ValidateToken(ctx, bearer); err == nil { authenticateJWTUser(c, user, tenantID) // 通道一:JWT,解析空间与角色 return } authenticateAPIKeyRequest(c, xAPIKey) // 通道二:X-API-Key // 三通道全部未命中 → 返回 401

JWT 通道服务真人:登录成功后签出一对令牌,短的 access_token 用于日常请求,长的 refresh_token 用来续期,令牌会落库登记,支持后续撤销。API Key 通道服务机器:请求头带上X-API-Key,服务端反查出所属空间。值得注意的细节是,API Key 路由门禁给每条路由单独声明策略,未声明的路由对 API Key 默认拒绝(fail-closed),避免"忘了加限制"这种经典事故。

两条通道殊途同归:认证结果会被写进请求上下文,为后面的角色判断和租户过滤做准备。

怎么给路由挂角色门槛:RequireRole 的接法

认出身份后,下一个问题是:这个身份能不能碰这条路由?这就是 RBAC 访问控制的用武之地。

WeKnora 的空间成员有四级角色:viewer < contributor < admin < owner,高角色继承低角色权限。角色检查集中在 RequireRole 中间件,接法很直白——路由注册时声明最低角色即可:

// 路由声明最低角色:访客进不了写操作的门 group.POST("/knowledge-bases/:id/knowledge", middleware.RequireRole(types.TenantRoleContributor, cfg), h.AddKnowledge)

三个设计决定值得记住:

  • fail-closed 兜底:如果上下文里没解析出角色,读取方默认按viewer处理,宁可直接拒绝也不放行。
  • 灰度开关:配置项tenant.enable_rbac关闭时,越权请求只记日志不拦截,方便生产环境平滑上线;开启后同样的代码开始真正返回 403。
  • 归属优于角色:contributor 在"自己创建的知识库"里拥有完全控制权,在别人的库里等同 viewer。资源表上的creator_id字段是归属判断的依据,配合OwnedKBOrAdmin这类归属守卫,写操作要求"是创建者或至少 Admin"。角色矩阵与归属模型的完整说明见空间 RBAC 文档。

怎么为查询自动附加租户过滤

角色只管"操作级别",真正的多租户数据隔离发生在数据访问层——而且它不需要业务代码"记得"加条件。

关键动作发生在认证收尾处:applyAuthSession 把身份一次性写入请求的两个读取面(gin 键与 request context),保证下游无论用哪种方式取都一致:

// 认证通过后统一写入,供全链路共享 if s.TenantID != 0 { set(types.TenantIDContextKey, s.TenantID) // 租户隔离的关键 } set(types.UserContextKey, s.User) set(types.TenantRoleContextKey, s.Role) // 空间内角色

下游的 repository 层从这里取出 tenantID,拼进每条 SQL。以知识库为例:

// 知识库的所有读取都强制带上租户条件 db.Where("id = ? AND tenant_id = ?", id, tenantID).First(&kb) db.Where("tenant_id = ?", tenantID).Find(&kbs)

这就是"自动"的含义:租户 ID 不是前端传来的参数,而是认证链路单方面注入的,业务代码无法绕过。跨空间超级管理员是明确的例外,需要CanAccessAllTenants标记且通过canAccessTenant门禁后才生效,属于受控通道而非默认行为。

登出时怎么把令牌作废旧

权限的最后一环常常被忽略:登出后,旧令牌还该不该有效?

WeKnora 的令牌不是"签出去就不管"。用户服务维护一张令牌登记表,access_token 与 refresh_token 分开标记类型。登出时调用RevokeToken把令牌状态置为已撤销,之后即使签名仍有效、未过期,ValidateToken校验登记状态后也会拒绝放行。refresh 换发新令牌时,旧 refresh_token 同步作废,形成滚动回收。配合较短的 access_token 有效期,泄露窗口的影响被压到最小。

至此一次请求走完了全程:认证认出你是谁 → 角色判断你能做什么 → 查询过滤你能看什么 → 登出终止你的令牌。

延伸阅读

  • 空间 RBAC 完整说明
  • 认证中间件源码
  • 角色检查中间件源码
  • 用户数据模型

【免费下载链接】WeKnoraOpen-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.项目地址: https://gitcode.com/GitHub_Trending/we/WeKnora

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

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

机械厂供配电系统课程设计全流程:从负荷计算到设备校验

简介&#xff1a;机电类或电气工程专业学生在完成供配电系统课程设计时&#xff0c;需要一份覆盖全流程的参考方案。该资源以设计说明书形式呈现&#xff0c;完整收录某机械厂供配电系统设计的主要环节&#xff0c;包括设计任务分析、负荷计算与无功补偿、变压所选址、主变压器…

作者头像 李华
网站建设 2026/9/6 20:06:19

MATLAB实现二维连续吸引子神经网络:从活动斑模拟到参数调优

简介&#xff1a;面向具备一定编程基础、对连续吸引子神经网络感兴趣的科研人员和学生&#xff0c;资源系统讲解二维连续吸引子神经网络&#xff08;2D-CANN&#xff09;的仿真实现与动态特性分析。内容覆盖5050神经元网络的循环连接设计、基于电导的膜电位计算、阈值线性发放率…

作者头像 李华
网站建设 2026/9/6 20:05:06

互换性公差与测量基础核心解析:从习题答案到工程公差手感

简介&#xff1a;《互换性公差与测量基础&#xff08;第四版&#xff09;》配套习题答案以PDF形式整理&#xff0c;面向机械设计制造及其自动化、机电一体化等专业学生&#xff0c;以及备考阶段需要刷题自测的读者。答案覆盖教材第一至第十一章习题&#xff0c;包含互换性定义与…

作者头像 李华
网站建设 2026/9/6 20:04:50

数据治理整体规划汇报56页PPT实战拆解:从现状诊断到实施路径

简介&#xff1a;这是一份以数据治理整体规划为主题的PPT汇报材料&#xff0c;目标读者为企业信息化、数据管理及数字化转型相关岗位人员。内容围绕数据治理建设诉求、体系构建、交付成果、实施方法四个模块展开&#xff0c;借助DCMM数据管理能力成熟度模型&#xff0c;系统梳理…

作者头像 李华
网站建设 2026/9/6 20:04:24

Cap安装教程:macOS与Windows录屏软件一步上手

Cap安装教程&#xff1a;macOS与Windows录屏软件一步上手 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 你刚讲完一轮产品演示&#xff0c;想把关键几步操作录…

作者头像 李华
网站建设 2026/9/6 20:03:58

74HC138 3-8译码器全解析:从原理到设计报告实战

简介&#xff1a;基于74HC138芯片的3-8译码器设计报告&#xff0c;完整覆盖数字集成电路课程设计全流程&#xff0c;面向电子工程、微电子专业学生及硬件设计入门者。报告从功能分析与逻辑设计出发&#xff0c;明确驱动10个LSTTL电路、VDD3.3V下VOH3V、VOL0.3V&#xff0c;以及…

作者头像 李华