在使用微信云开发云数据库时,如果安全规则为:
{ "read": "auth.openid in doc.users" } ,此时如何读取数据?
(这里忽略write权限,暂时只考虑read权限。)
无论我使用:
const _ = db.command
const res = await db.collection('xxx')
.where({
users: _.all(['{openid}']),
})
.get()
或者使用:
const _ = db.command
const res = await db.collection('xxx')
.where({
users: _.elemMatch(_.eq('{openid}'))
})
.get()
都会抛出 Error: errCode: -502003 database permission denied | errMsg: Permission denied 权限不足的错误。
我的目的是,只要是用户的 _openid 在文档的 users 这个字段中,就有读取权限。
但是目前无论怎么写查询语句,都会抛出这个权限不足的错误,请问如何处理?
======= 补充 =======
我把这个问题重新整理后,提了一个新的关联问题: https://developers.weixin.qq.com/community/develop/doc/000a2c023f08b83f0652b6a5e6ac00?fromCreate=0
目前已经根据官方文档改成这个形式了(如上图所示,把这个规则用于room集合),但是读取时依然出现权限不足的错误,错误大概如下:
Error: errCode: -502003 database permission denied | errMsg: SecurityRuleError: 错误的值 (Cannot read properties of undefined (reading 'members'))
(数据集合中只有一个文档,我确保当前用户的openid是在这个文档的members数组中。)
那么,是不是在where中需要添加某个查询条件呢? 这个查询条件是什么呢?
{ "read": "auth.openid in doc.users" } 语法有问题
安全规则这块语法, in 语法只支持常量,不支持动态的 doc.users 这种动态指定库字段的
动态指定可以用 get 语法,但这种需要指定集合里一个字段的值,可以看看是否满足要求;
具体可以参考下群聊这块的使用场景:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/security-rules.html#%E7%A4%BA%E4%BE%8B-1%EF%BC%9A%E7%BE%A4%E8%81%8A
"read": "auth.openid in get('database.room.${doc._id}').members"
权限设置为所有人可读,再运行你的脚本。