Javascript 如何使用Bolt定义规则以允许修改类型的子项,而不提供所有其他字段
在我的应用程序中,我将用户数据保存在firebase数据库中。经过身份验证的用户可以更改其中的大多数属性。但是有一个(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
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()
规则。