在我的应用中,我将用户数据保存在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
提取到他们自己的路径?