news 2026/7/10 1:47:43

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
跨组织/跨租户权限怎么设计:隔离/共享/委托(附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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 2:08:15

RPA流程嵌入:在UiPath中调用GLM-TTS完成语音播报任务

RPA流程嵌入:在UiPath中调用GLM-TTS完成语音播报任务 在现代企业自动化实践中,RPA早已不再局限于“自动填表”或“点击下一步”的简单操作。当业务系统越来越复杂,用户对交互体验的要求也水涨船高——人们不仅希望机器人能“做事”&#xff0…

作者头像 李华
网站建设 2026/7/4 21:39:56

如何将ARW文件转换为JPG?5种超简单方法

对于摄影爱好者而言,RAW格式是相机的“数字底片”,保留了最原始、最丰富的画面细节,是后期修图的绝佳基础。然而,RAW文件的体积庞大且兼容性较差,无法直接在大多数社交平台分享或在普通设备上查看。因此,ra…

作者头像 李华
网站建设 2026/7/2 1:02:36

灵活性供需不确定性下的储能优化配置方法研究及MATLAB代码复现

MATLAB代码:考虑灵活性供需不确定性的储能参与电网调峰优化配置 关键词:储能优化配置 电网调峰 风电场景生成 灵活性供需不确定性 参考文档:《考虑灵活性供需不确定性的储能优化配置》复现其上层模型,下层模型未实现 仿真平台&am…

作者头像 李华
网站建设 2026/7/1 17:09:45

SRC 入门必看:挖洞难的原因 + 避坑指南

一.为何挖不到漏洞? 信息收集不够多,或者做了信息收集但是分析的不够彻底和仔细。有几点要求需要大家注意:首先是要熟读刑法,了解那些是经过授权的渗透;其次,收集的信息要多,越多越好,包括子域…

作者头像 李华
网站建设 2026/7/8 8:41:39

甲方要的 6 个核心结果!护网监测别做无用功

一、护网监测 “找异常 堵漏洞”:甲方考核的 6 个核心结果 护网监测是蓝队的核心工作,甲方不看你 “做了多少事”,只看你 “有没有产出结果”—— 以下是 90% 企业都会考核的 6 个监测结果,做好了能直接拿项目奖金: …

作者头像 李华