unicloud开发中,云函数做数据库的增删改查受DB Schema的权限控制吗?

来源:IT星空
访问量:13
发布日期:2025-05-17

在 UniCloud 开发中,云函数对数据库的增删改查默认不受 DB Schema 的权限控制,但可以通过配置使其受 Schema 约束。具体规则如下:

一、默认情况:云函数不受 Schema 权限控制

UniCloud 的云函数运行在服务端,默认具有最高权限,可以绕过 DB Schema 中配置的读写权限(如仅允许用户读写自己的数据)。这意味着:

  1. 云函数可以对任何集合进行增删改查,无论 Schema 如何配置。
  2. 云函数可以读写其他用户的数据,即使 Schema 设置了 auth 权限。

示例代码(云函数中直接操作数据库):

// 云函数中,即使 Schema 配置了 "auth": "readSelf",仍可读取所有用户数据
const db = uniCloud.database();
exports.main = async (event, context) => {
  const res = await db.collection('users').get(); // 可读取所有用户
  return res;
};

二、如何让云函数受 Schema 权限控制?

若需让云函数遵循 Schema 权限,可以通过以下方式实现:

1. 使用 databaseForJQL 并传递 clientInfo

在云函数中使用 databaseForJQL 并传入 clientInfo,可以模拟客户端请求,使云函数受 Schema 权限约束:

exports.main = async (event, context) => {
  const db = uniCloud.databaseForJQL({
    clientInfo: context.clientInfo // 传递客户端信息
  });
  
  // 此时查询会受 Schema 权限控制
  const res = await db.collection('users').where('user_id == $cloudEnv_uid').get();
  return res;
};

2. 在 Schema 中添加 runtime 验证

在 DB Schema 中添加 runtime 函数,可以对云函数的操作进行额外验证:

{
  "permissions": {
    "read": {
      "runtime": "return doc.user_id === $cloudEnv_uid || $cloudEnv_uid === 'admin';"
    }
  }
}

三、云函数与客户端权限对比

场景是否受 Schema 权限控制说明
客户端直接操作数据库✅ 是严格受 Schema 权限约束,如 auth、validate 等配置。
云函数(默认)❌ 否云函数默认有最高权限,可绕过 Schema 权限。
云函数 + databaseForJQL✅ 是通过传递 clientInfo,使云函数行为与客户端一致,受 Schema 权限控制。