收藏
回答

云数据库自定义权限问题?

根据微信文档,权限自定义实例: 群聊 ,模拟测试,被拒绝访问

聊天室集合chats:

{
  _id: string,
  owner: string, // 群主 openid
  name: string, // 群名
  members: string[], // 成员 openid 列表
}

权限定义:

{
"read": "auth.openid in get('database.chats.$(doc._id)').members",
"write": "doc._openid == auth.openid"
}

在小程序端, 在云数据库写记录成功如下:

_id: "chatRoomId",
_openid: "thisMyOpenid".
owner: "thisMyOpenid",
members: ['openidNo1','openidno2',"thisMyOpenid"],
name: "chatRoomName"

在小程序端

await database.collection("chats").where({
          _id: “chatRoomId”,
          _openid: '{openid}'
        }).get()

报错:

VM855 WAService.js:3 Uncaught (in promise) Error Error: errCode: -502003 database permission denied 
| errMsg: SecurityRuleError: 错误的值 (Cannot read property 'members' of undefined)
    at new u (VM855 WAService.js:2)
    at Function.success (VM855 WAService.js:2)
    at Object.success (VM855 WAService.js:2)
    at y (VM855 WAService.js:2)
    at v (VM855 WAService.js:2)
    at VM855 WAService.js:2
    at e. (VM853 asdebug.js:1)
    at VM855 WAService.js:2
    at VM855 WAService.js:2

翻来覆去的看文档,不知问题在哪,请求帮助

//////////////////////////////////////新的问题////////////////////////////////////////////////////////////////

@stop eating 这两天我给room增加了几个读取功能,又遇到问题

首先我改了room 的权限为:

{
  "read": "auth.openid in get(`database.chats.${doc._id}`).members || doc.creator == auth.openid",
  "write": "doc._openid == auth.openid"

}

我使用

await db.collection('room').where({_openid'{openid}',owner'{openid}'}).get()

获得所有‘{openid}'创建的rooms,这个没问题

然后我使用:

await db.collection('room').where({members: _.in(['{openid}'])}).get()
或者
await db.collection('room').where({members: _.in(['one_Openid_In_Members'])}).get()
或者
await db.collection('room').where({}).get()
或者
await db.collection('room').where({_id: _.neq("")}).get()

获得在 room’s members 里的人的所有rooms, 一直出错

Uncaught (in promise) Error Error: errCode: -502003 database permission denied | errMsg: Permission denied

我知道我的查询条件与权限设置 "auth.openid in get(`database.chats.${doc._id}`).members” 不相符

需要在查询中有 _id 参数,但对获得所有room id,显然不行,微信的文档实在是简约,我还没有测试聚合

不知道聚合与这些权限的设置的关系, 我担心可能又是困难重重。

stop eating请帮下忙!


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

3 个回答

  • Mr.Zhao
    Mr.Zhao
    2020-06-07

    用反引号

    auth.openid in get(`database.chats.$(doc._id)`).members
    


    2020-06-07
    有用 1
    回复 14
    • 2020-06-07
      还是不行
      2020-06-07
      回复
    • Mr.Zhao
      Mr.Zhao
      发表于小程序端
      2020-06-07回复
      我的行
      2020-06-07
      回复
    • 2020-06-08
      仔细看了下,可能找到问题应该是 get(`database.chats.${doc._id}`),  其中 ${doc._id} 被我写成 $(doc._id)
      2020-06-08
      回复
    • 2020-06-08
      是的,是这个问题,非常感谢
      2020-06-08
      回复
    • 2020-06-08
      另外:刚测试,get()的参数一定要用` 而不是’
      2020-06-08
      回复
    查看更多(9)
  • 2020-06-08

    stop eating再麻烦你看看:

    我还是用微信文档这个聊天实例

    message集合,权限设置实例是

    {
      // 仅能读取自己所在房间的聊天消息,且不允许读取已撤回的消息
      "read": "auth.openid in get('database.room.${doc.room}').members && doc.withdrawn == false",
      // 只能在云函数写:
      //  - 仅能在自己所在的房间发消息
      //  - 只能修改自己发送的消息
      //  - 不能删除自己发送的消息(只能撤回)
      "create": "auth.openid in get('database.room.${doc.room}').members",
      "update": "auth.openid == doc.sender",
      "delete": false
    }
    
    

    在小程序端读:

    await db.collection("message").where({
          _openid'{openid}',
          chatRoomId : "chatRoomId-room-collection-id"
      }).get()
    

    还是出错:

    Uncaught (in promise) Error Error: errCode: -502003 database permission denied | errMsg: Permission denied
    

    显然还是

    “auth.openid in get('database.room.${doc.room}').members” 
    

    出错,但这次显然能够读到members里的数据,我在想是不在message集合里的权限设置如需要用到room集合里的数据是不是需要在云端才能实现,就像这个权限设置的“写”都要在云端做一样,也就是跨集合的权限要在云端实现,但感觉又不对,我还没来得及测试

    @stop eating 你看如何?

    2020-06-08
    有用
    回复 2
    • 2020-06-08
      已解决,看上面stop eating发现解决方法
      2020-06-08
      回复
    • 2020-06-08
      如下OK
      2020-06-08
      回复
  • 陆叶凤
    陆叶凤
    发表于移动端
    2020-06-07
    河北省石家庄市苏仁峰加我微信吗
    2020-06-07
    有用
    回复
登录 后发表内容
问题标签