在 UniCloud 开发中,云函数对数据库的增删改查默认不受 DB Schema 的权限控制,但可以通过配置使其受 Schema 约束。具体规则如下:
UniCloud 的云函数运行在服务端,默认具有最高权限,可以绕过 DB Schema 中配置的读写权限(如仅允许用户读写自己的数据)。这意味着:
auth
权限。示例代码(云函数中直接操作数据库):
// 云函数中,即使 Schema 配置了 "auth": "readSelf",仍可读取所有用户数据
const db = uniCloud.database();
exports.main = async (event, context) => {
const res = await db.collection('users').get(); // 可读取所有用户
return res;
};
若需让云函数遵循 Schema 权限,可以通过以下方式实现:
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;
};
runtime
验证在 DB Schema 中添加 runtime
函数,可以对云函数的操作进行额外验证:
{
"permissions": {
"read": {
"runtime": "return doc.user_id === $cloudEnv_uid || $cloudEnv_uid === 'admin';"
}
}
}
场景 | 是否受 Schema 权限控制 | 说明 |
---|---|---|
客户端直接操作数据库 | ✅ 是 | 严格受 Schema 权限约束,如 auth、validate 等配置。 |
云函数(默认) | ❌ 否 | 云函数默认有最高权限,可绕过 Schema 权限。 |
云函数 + databaseForJQL | ✅ 是 | 通过传递 clientInfo,使云函数行为与客户端一致,受 Schema 权限控制。 |