('{openid}'不支持查询指令,需要后端获取)? 没太懂 云开发 数据库 安全规则详解的帖子
发布于 4 年前 作者 naxue 776 次浏览 来自 官方Issues

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}")),
  })

也会被没有权限拒绝

菜鸟不太理解这里,求大神指点迷津。

3 回复
"{openid}"

这种文字应该理解为:这里填用户的openid

像你中间描述的权限那么复杂,不如云函数自己做权限控制。

或者说,我不知道这个 auth.openid in doc.teacher

的where条件子集怎么写,也没找到相关示例

回到顶部