收藏
回答

云开发数据库自定义权限后,小程序端无法更新,请问是我哪里写错了吗?

新建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

最后一次编辑于  2020-04-25
回答关注问题邀请回答
收藏

1 个回答

  • 吃包子不吐包子皮
    吃包子不吐包子皮
    2020-04-22

    规则中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"
    }
    


    2020-04-22
    有用 1
    回复 1
    • 浅阳
      浅阳
      2020-04-25
      谢谢您
      2020-04-25
      回复
登录 后发表内容
问题标签