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

Javascript 如何使用Bolt定义规则以允许修改类型的子项,而不提供所有其他字段,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,在我的应用程序中,我将用户数据保存在firebase数据库中。经过身份验证的用户可以更改其中的大多数属性。但是有一个(score)属性,我只想从外部服务更改它。用户可以读取其值,但不得更改 我正在使用来定义数据库上的安全规则 如果我的Bolt文件如下所示: type User { name: String score: Score } type Score extends Number | Null { validate() { canChangeScore() } } canC

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

我正在使用来定义数据库上的安全规则

如果我的
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  }
现在,当我尝试使用以下函数从外部服务更新
得分
字段时:

function incUserScore(userId) {
  const scoreRef = firebase.database().ref('users').child(userId).child('score');
  scoreRef.transaction(current => (current || 0) + 1)
}
由于
json
规则中的行
5
,我获得了
permission\u denied
错误,因为我没有提供
name
字段


有没有任何方法可以在Bolt中表达这样的意图,而不使所有用户字段为空或将
分数提取到它们自己的路径

你可能会觉得有用。特别是评论。如果用户不应该更改分数,我建议你将分数和用户数据分开。使用当前规则,用户可以更改分数because@Andr你说得对。我已经更新了问题,以便
分数
使用
validate()
而不是
write()
规则。