如何使用Bolt定义规则以允许修改类型的子节点而不提供所有其他字段

时间:2016-08-22 12:10:27

标签: javascript firebase firebase-realtime-database firebase-security

在我的应用中,我将用户数据保存在firebase数据库中。经过身份验证的用户可以更改其中的大多数属性。但是我希望能够从外部服务 更改一个(score)属性。用户可以读取其值但不得更改它。

我使用Bolt在我的数据库上定义安全规则。

如果我的Bolt文件如下所示:

type User {
  name: String
  score: Score
}

type Score extends Number | Null {
  validate() { canChangeScore() }
}

canChangeScore() { auth.canChangeScore === true }

path / {
  read() { true }
  path /users/{id} is User {
    write() { auth.uid == id }
  }
}
然后它会给我这些规则:

 1  {
 2    "rules": {
 3      "users": {
 4        "$id": {
 5          ".validate": "newData.hasChildren(['name'])",
 6          "name": {
 7            ".validate": "newData.isString()"
 8          },
 9          "score": {
10            ".validate": "newData.isNumber() && auth.canChangeScore == true"
11          },
12          "$other": {
13            ".validate": "false"
14          },
15          ".write": "auth.uid == $id"
16        }
17      },
18      ".read": "true"
19    }
20  }

现在,当我尝试使用以下函数更新外部服务中的score字段时:

function incUserScore(userId) {
  const scoreRef = firebase.database().ref('users').child(userId).child('score');
  scoreRef.transaction(current => (current || 0) + 1)
}

由于permission_denied规则中的行5,我收到json错误,因为我没有提供name字段。

有没有办法在Bolt中表达这样的意图而不会使所有用户字段为Nullable或将scores提取到他们自己的路径?

0 个答案:

没有答案