当前位置: 首页 > news >正文

跨组织/跨租户权限怎么设计:隔离/共享/委托(附SaaS权限模板)

前言

多租户是SaaS系统的核心特性。很多SaaS系统的数据泄露都是因为租户隔离没做好。这篇给你多租户权限的3种策略+完整设计方法。

一、3种多租户策略

策略特点适用场景优点缺点
完全隔离每个租户独立数据库高安全要求安全性高成本高
共享隔离共享数据库,tenant_id隔离通用SaaS成本低需严格校验
混合模式核心数据隔离,其他共享平衡安全与成本灵活复杂度高

二、共享隔离模式(推荐)

核心原则

  • 所有数据表必须有tenant_id字段
  • 所有查询必须带WHERE tenant_id = 当前租户ID
  • 跨租户访问返回403

实现步骤

步骤1:数据表设计

所有业务表必须包含tenant_id字段,并建立索引。

订单表(orders)示例: CREATE TABLE orders ( id BIGINT PRIMARY KEY AUTO_INCREMENT, tenant_id BIGINT NOT NULL COMMENT '租户ID', user_id BIGINT NOT NULL COMMENT '用户ID', order_no VARCHAR(32) NOT NULL COMMENT '订单号', amount DECIMAL(10,2) NOT NULL COMMENT '订单金额', status VARCHAR(20) NOT NULL COMMENT '订单状态', created_at DATETIME NOT NULL, INDEX idx_tenant_id (tenant_id), INDEX idx_tenant_user (tenant_id, user_id) ) COMMENT='订单表'; 注意: - tenant_id必须NOT NULL - 在tenant_id上建立索引,提高查询性能 - 联合索引(tenant_id, user_id)支持按租户和用户查询
步骤2:租户ID获取

从用户登录信息中获取tenant_id,不能从请求参数中获取。

伪代码示例: // 从JWT Token中获取租户ID function getTenantId(request) { const token = request.headers.authorization; const decoded = jwt.decode(token); return decoded.tenant_id; // 从token中获取,不能从参数获取 } // 从Session中获取租户ID function getTenantIdFromSession(request) { return request.session.user.tenant_id; // 从session中获取 }
步骤3:查询自动过滤

在数据访问层统一添加tenant_id过滤条件。

伪代码示例: // 数据访问层统一处理 function getOrders(user, filters) { let query = "SELECT * FROM orders"; let where = []; // 自动添加tenant_id过滤 where.push("tenant_id = " + user.tenant_id); // 添加其他过滤条件 if (filters.status) { where.push("status = '" + filters.status + "'"); } if (where.length > 0) { query += " WHERE " + where.join(" AND "); } return executeQuery(query); } // 平台管理员特殊处理 function getOrdersForAdmin(admin, filters) { let query = "SELECT * FROM orders"; let where = []; // 平台管理员不添加tenant_id过滤,但可以指定租户 if (filters.tenant_id) { where.push("tenant_id = " + filters.tenant_id); } if (where.length > 0) { query += " WHERE " + where.join(" AND "); } return executeQuery(query); }
步骤4:跨租户访问校验

在接口层校验数据归属,防止跨租户访问。

伪代码示例: // 接口层校验 app.get('/api/orders/:id', async (req, res) => { const order = await getOrderById(req.params.id); const userTenantId = req.user.tenant_id; // 校验租户归属 if (order.tenant_id !== userTenantId && req.use
http://www.jsqmd.com/news/194190/

相关文章:

  • 2025双盘抹光机厂家权威推荐榜单:双盘磨光机/⼿扶抹光机/单盘磨光机/单盘抹光机/⼿扶磨光机源头厂家精选。 - 品牌推荐官
  • 2025高压罗茨风机厂家权威推荐榜单:曝气罗茨风机/污水处理罗茨风机/正压罗茨风机/罗茨风机维修/不锈钢罗茨风机/物料输送罗茨风机源头厂家精选。 - 品牌推荐官
  • 微信公众号推文写作:打造系列GLM-TTS技术科普文章
  • 字段清单三件套:列表/表单/筛选(附10个常见字段模板)
  • 老年关怀产品设计:用GLM-TTS降低数字鸿沟影响
  • 风力涡轮机系统与压缩空气储能联合运行的建模与实验研究(Matlab代码实现)
  • 百度搜索结果优化:提高GLM-TTS相关文章收录概率
  • #pragma unroll(5) 的展开方式
  • 如何将ARW文件转换为JPG?5种超简单方法
  • NPS净推荐值测算:评估GLM-TTS用户的忠诚度水平
  • 高校科研合作提案:推动GLM-TTS在学术界的广泛应用
  • 执医考试技巧培训机构哪家强?十大医考机构客观测评 - 医考机构品牌测评专家
  • 负荷预测|一种改进支持向量机的电力负荷预测方法研究(Matlab代码实现)
  • Scrum 价值观 解读
  • mybatisplus无关但热门?借势推广AI基础设施服务
  • CI/CD流水线搭建:自动化测试与发布GLM-TTS新版本
  • 小红书种草文案:女性视角讲述GLM-TTS改变工作方式
  • 国际化与本地化支持:让GLM-TTS走向全球市场
  • 机场值机自助终端:多语言航班信息语音播报
  • 移动端适配方案:开发Android/iOS版语音合成APP
  • 不用再盲目找资源!2026黑客技术自学网站终极合集,覆盖入门到精通_黑客学习网站
  • 医疗报告语音化:方便医生在移动中听取患者数据
  • 救命神器10个AI论文网站,MBA论文写作必备!
  • 前端性能优化:从首屏加载 5秒 优化到 0.5秒,我做了这 6 件事(Webpack 配置实战)
  • 心理疏导语音包:为焦虑人群提供温暖陪伴
  • Java程序员大模型开发宝典:利用工程化优势,轻松掌握AI新时代,打造收藏级技能教程!
  • 谷歌镜像站点资源整理:辅助获取GLM-TTS相关组件
  • app.py入口文件分析:理解GLM-TTS Web服务运行机制
  • 物流状态播报:让用户听到包裹运输进展
  • 企业定制化服务介绍:为大客户提供专属语音模型训练