根据微信文档,权限自定义实例: 群聊 ,模拟测试,被拒绝访问
聊天室集合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请帮下忙!
用反引号
auth.openid in get(`database.chats.$(doc._id)`).members
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 你看如何?
await db.collection("message").where({
withdraw: false,
chatRoomId : "chatRoomId-room-collection-id"
}).get()