讲师中心 微信公众号
AI工具推荐 视频效率加速

uni-app如何实现uniCloud云开发的多租户权限

老伟君_6183

老伟君_6183

发布时间:2026-07-24 09:20:07

|

829人浏览过

|

来源于php中文网

原创

uniCloud多租户权限需前后端协同隔离、权限规则下沉及状态强校验,云函数须从token解析用户身份并校验所属租户,数据库操作强制带tenant_id过滤,Schema权限按租户粒度配置,前端切换租户时必须清空缓存并重载数据。

uni-app如何实现unicloud云开发的多租户权限

uniCloud 实现多租户权限,核心不是“加个 tenant_id 就完事”,而是前后端协同隔离 + 权限规则下沉 + 状态强校验。直接在数据库查 tenant_id 字段但没配 Schema 权限,或前端缓存了上一租户的数据,都会导致越权或脏数据。

云函数里必须做租户上下文绑定

不能依赖前端传来的 tenant_id 参数做查询过滤——它可能被篡改、缓存、或压根没传。

正确做法是在云函数入口统一提取并校验租户身份:

  • 从 event.uniIdToken 解析用户登录态,再查 uni-id-users 表拿到该用户所属的 org_id 或 tenant_id
  • 若业务支持单用户跨租户(如管理员),则需额外校验用户角色是否具备访问目标租户的权限
  • 所有数据库操作都显式带上 .where({ tenant_id: actualTenantId }),哪怕表结构里没这个字段也要加(防止误查)

示例片段(云函数中):

exports.main = async (event, context) => {
  const { uniIdToken } = event;
  const tokenInfo = await uniID.decodeToken(uniIdToken);
  const userId = tokenInfo.uid;
  
  // 查用户归属租户(假设存在 orgs_users 关联表)
  const userOrgRes = await db.collection('orgs_users').where({ user_id: userId }).get();
  const tenantId = userOrgRes.result.data[0]?.org_id;
  
  if (!tenantId) throw new Error('no valid tenant for user');
  
  // 后续所有查询都强制加 tenant_id 过滤
  const list = await db.collection('approval_templates').where({ tenant_id }).get();
  return list;
};

数据库 Schema 权限必须按租户粒度配置

uniCloud 的权限控制不在代码里,而在控制台的 .schema.json 文件中。即使你云函数里写了 tenant_id 过滤,如果表的读权限没放开,照样返回空或 403。

关键点:

  • 进 uniCloud 控制台 → 找到对应服务空间 → 数据库 → 点击表名 → “表结构” → “权限”标签页
  • 读权限不能设为 "read": true(全局可读),而要写成:"read": {"auth": "user", "query": {"tenant_id": "@user.tenant_id"}}
  • @user.tenant_id 是前提:你得先在 uni-id-users 表里存了这个字段,且用户登录后 token 中能携带它(需自定义 uni-id 的 token payload)

否则,前端调用 uniCloud.database().collection('xxx').get() 会直接失败,连云函数都不经过。

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载

前端切换租户时必须清空所有缓存状态

常见错误是:用户从租户 A 切到租户 B,但 ref 里的列表、分页参数、草稿数据全还是 A 的——这不是后端没隔离,是前端没重置。

具体要清理的点:

  • 所有 ref 或 store 中与租户强相关的 state(如 templateList、currentPage、draftForm)
  • 路由参数中的 tenant_id 必须参与守卫逻辑:router.beforeEach 里检查当前租户是否有效,无效则跳转或清空
  • 不要用 if (loaded) return 这类懒加载逻辑,每次切换租户都要重新 get()

尤其注意 onShow 和 onLoad 生命周期——小程序切后台再回来时,很可能没触发租户重载逻辑,得手动补。

租户标识不能只靠域名或路径硬编码

有人用 window.location.hostname.split('.')[0] 提取子域名当 tenant_id,这在 H5 可行,但在 App 或小程序里根本拿不到完整域名,直接 fallback 成空字符串或默认值。

安全做法是:

  • H5:走 Nginx 子域名解析 + 前端透传给云函数(仅作辅助,不作为唯一依据)
  • App / 小程序:首次登录后,后端在 token 中写入 tenant_id,前端通过 uni.getStorageSync('uni_id_token') 解析并缓存;后续所有请求自动带这个上下文
  • 绝对避免在 main.js 里一次性赋值 Vue.prototype.$tenant —— 它不会随登录态变化而更新

最麻烦但最稳的方式:每次云函数调用都显式传 tenant_id,后端再和登录态比对。差一点就拒绝,而不是“尽力而为”。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2743

2023.08.11

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

5983

2023.10.09

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

6930

2024.03.19

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

6698

2024.03.22

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

963

2024.05.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

40

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

160

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

140

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn