新建2个集合按照官方文档测试。想实现 ‘仅管理员和创建者可操作’ 的功能。测试无法更新。user集合权限改成公有写,可更新。请大大指教如何实现仅管理和创建者可写的功能。详情图如下:
集合1:admin
集合1权限:
集合2:user
集合2权限:
{
"read": "doc._openid == auth.openid|| auth.openid in get('database.admin.${doc._openid}').adminOpenid",
"write": "doc._openid == auth.openid|| auth.openid in get('database.admin.${doc._openid}').adminOpenid"
}
小程序客户端测试代码:
test(){
//更新指定字段
const db = wx.cloud.database({env: 'pfyj********b'})
const todos = db.collection('user')
todos.where({
_openid: 'o6My***********VyE' //无错误
}).update({
data: {
phone: "test"
},
success: function (res) {
console.log(res)
},
fail:function(res){
console.log("cuowu",res)
}
})
}
提示错误:cuowu Error: errCode: -502003 database permission denied | errMsg: Permission denied
规则中get函数如果使用变量的话, 需要使用反引号(即 ` ) 类比 js 中的字符串模板语法, 如果使用单引号的话,认为是静态字符串, 因此规则可以这么设置
{ "read": "doc._openid == auth.openid|| auth.openid in get(`database.admin.${doc._openid}`).adminOpenid", "write": "doc._openid == auth.openid|| auth.openid in get(`database.admin.${doc._openid}`).adminOpenid" }
另外, admin 表中并不存在 _id 为 'o6My***********VyE 的记录 ,因此权限校验也会失败,get 的参数是获取 database.collection.docid 的doc, admin 表中记录的id为 “b398****2f38”(截图中记录完整的_id)
因此规则最终修正为
{ "read": "doc._openid == auth.openid|| auth.openid in get(`database.admin.b389****2f38`).adminOpenid", "write": "doc._openid == auth.openid|| auth.openid in get(`database.admin.b389****2f38`).adminOpenid" }