使用自定义安全规则:
{
"read": "doc._openid == auth.openid",
"write": "doc._openid == auth.openid"
}
数据库:
todos : {
_id : 'xxxxxx',
_openid : 'xxxxxxxxxxx1234', //这是在开发环境运行app插入数据时自动插入的值,
data : 'test'
}
查询的时候传入“_openid”作为唯一的参数,可以成功取到数据:
db.collection('todos').where({
_openid: 'xxxxxxxxxxx1234',
}).get().then(res =>{
console.log(res);
});
然后我做了几个测试:
1. 把where里传递的_openid值改成其它值,包括瞎写一个值,和写一个其它的正确的openid,都会抛出错误:
db.collection('todos').where({
_openid: '换了一个openid',
}).get().then(res =>{
console.log(res);
});
Error: errCode: -502003 database permission denied | errMsg: Permission denied
2. 直接在云管理界面把数据库的_openid记录改成其它值,程序依然传递正确的openid,这次只是像期待的那用取不到记录,但是不抛出错误。
3. 不传递openid,我看到文档里说只要使用建议的自定义安全规则,就要传递openid参数,因此依然提示:
Error: errCode: -502003 database permission denied | errMsg: Permission denied
换句话说,实际的安全规则考虑的是客户端自己上传的openid,外加_openid参数。这样做的目的是什么?
因为如果隐式的由小程序默默的传递openid,就省略了开发者自己获取openid的麻烦事。