news 2026/6/10 16:41:04

跨组织/跨租户权限怎么设计:隔离/共享/委托(附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/10 11:42:43

网络技术人才缺口白皮书:327 万缺口下的高薪赛道指南

随着信息技术的飞速发展,计算机网络技术已成为现代社会不可或缺的基础设施,深刻影响着各行各业。作为计算机类专业中的重要一员,计算机网络技术专业的毕业生正迎来前所未有的就业机遇。本文将深入探讨计算机网络技术专业的就业方向及前景&…

作者头像 李华
网站建设 2026/6/10 11:40:09

百度搜索结果优化:提高GLM-TTS相关文章收录概率

百度搜索结果优化:提高GLM-TTS相关文章收录概率 在AI语音技术飞速演进的今天,越来越多开发者开始关注如何将前沿模型落地到实际场景中。其中,GLM-TTS 作为新一代文本到语音系统,凭借其零样本语音克隆、高保真重建与情感迁移能力&a…

作者头像 李华
网站建设 2026/6/10 15:03:47

国际化与本地化支持:让GLM-TTS走向全球市场

国际化与本地化支持:让GLM-TTS走向全球市场 在智能语音助手、在线教育平台和跨境内容创作日益普及的今天,用户早已不再满足于“能说话”的TTS系统。他们期待的是自然如人声、富有情感、准确表达方言与专业术语的语音输出——尤其是在多语言、多方言并存的…

作者头像 李华
网站建设 2026/5/2 20:01:41

诗歌朗诵艺术再现:探索AI在文学表达中的边界

诗歌朗诵艺术再现:探索AI在文学表达中的边界 在朗读一首古诗时,我们为何会被某位名家的演绎深深打动?或许不只是因为文字本身,而是那声音里的停顿、轻重、气息与情感起伏——这些细微之处构成了语言的艺术灵魂。长久以来&#xff…

作者头像 李华
网站建设 2026/5/25 22:30:08

GPU算力租赁广告植入:在技术博客中自然推广硬件资源

GPU算力租赁广告植入:在技术博客中自然推广硬件资源 在语音合成技术快速演进的今天,我们早已不再满足于“机器念字”式的生硬播报。从智能助手到有声内容创作,用户对语音的自然度、情感表达和个性化提出了前所未有的高要求。以GLM-TTS为代表的…

作者头像 李华
网站建设 2026/6/10 15:37:49

技术文档SEO优化:提升GLM-TTS相关内容搜索排名

技术文档SEO优化:提升GLM-TTS相关内容搜索排名 在AI语音合成技术迅速渗透教育、媒体与数字人产业的今天,一个开源项目能否被广泛采用,往往不只取决于其算法能力——开发者能不能快速找到它、看懂它、用起来,才是决定成败的关键。G…

作者头像 李华