('{openid}'不支持查询指令,需要后端获取)? 没太懂 云开发 数据库 安全规则详解的帖子
https://developers.weixin.qq.com/community/business/doc/000eaa8ba2c9482d16ca7dab456c0d
云开发安全规则讲解 官方 的帖子 在微信学院里面
引用原文
2、把权限指定给某些人
上面的这个角色指定是一对一、或多对一的指定,也可以是一对多的指定,可以使用in
或!(xx in [])
运算符。比如下面是可以给一个记录指定多个角色(学生创建的记录,多个老师有权读写):
//文档的结构
{
_id:"handwork20201020",
_openid:"学生的openid", //学生为记录的创建者,
teacher:["老师1的openid","老师2的openid","老师3的openid"]
}
//安全规则
{
"read": "auth.openid in doc.teacher || doc._openid == auth.openid",
"write": "auth.openid in doc.teacher || doc._openid == auth.openid",
}
这里要再强调的是前端(小程序端)的 where 条件必须是安全规则权限的子集,比如我们在小程序端针对老师进行如下查询('{openid}'
不支持查询指令,需要后端获取)
db.collection("集合id")
.where({
_openid: "{openid}",
teacher: _.elemMatch(_.eq("老师的openid")),
})
.get()
.then((res) => {
console.log(res);
});
前面我们实现了将记录的权限指定给某个人或某几个人,那如何将记录的权限指定给某类人呢?比如打车软件为了数据的安全性会有司机、乘客、管理员、开发人员、运维人员、市场人员等,这都需要我们在数据库里新建一个字段来存储用户的类型,比如{role:3}
,用 1、2、3、4 等数字来标明,或者用{isManager:true}
boolean 类型来标明,这个新增的字段可以就在查询的集合文档里doc.role
,或者是一个单独的集合(也就是存储权限的集合和要查询的集合是分离的,这需要使用 get 函数跨集合查询),后面会有具体介绍。
不太清楚这个小程序端,针对老师进行如下查询
db.collection("集合id")
.where({
_openid: "{openid}",
teacher: _.elemMatch(_.eq("老师的openid")),
})
.get()
.then((res) => {
console.log(res);
});
我试了下,get到了寂寞
这个where 条件似乎不是安全规则权限的子集,然后被拒绝了。
针对老师端,这个"{openid}"肯定是老师的了,那么他就一定找不到想要的学生记录,是写错了还是我理解做了。
.where({
teacher: _.elemMatch(_.eq("{openid}")),
})
也会被没有权限拒绝
菜鸟不太理解这里,求大神指点迷津。