复杂的 Firebase 安全规则
Complex Firebase Security Rule
我的 Firebase 数据结构看起来像
-isAdmin
-user1
isAdmin: true
-users
-user1
-firsName: Jane
-lastLoggedIn: 12 March 2017
-user2
-firstName: John
-lastLoggedIn: 11 March 2017
我希望我的管理员(用户 1)能够执行以下操作
向-users 分支添加更多用户。所以我需要以下权限(创建 user3、user4...等)
"users": {
.write: "(auth != null) && (root.child('isAdmin').child(auth.id).val == true)
}
但是我也希望非管理员用户能够更新 lastLoggedIn 条目。所以我需要以下权限
"users": {
$userId: {
"lastLoggedIn": {
.write: "(auth != null) && ($userId == auth.id)
}
}
}
问题来了,firebase 不允许嵌套规则,因为我在 users 下有一个 .write 规则,我相信 users/$userId/lastLoggedIn 下的 .write 规则将被忽略
有办法解决这个问题吗?
Firebase 安全规则不允许嵌套规则是不正确的 - 它们允许。规则级联和您需要注意的情况是,一旦授予权限,它就不能被 'nested' 规则撤销。
所以 'nested' 规则只有在更高级别的规则已经授予写入权限时才会被忽略。如果尚未授予写权限并且 'nested' 规则授予写权限,则不会被忽略。
根据这些规则:
"users": {
".write": "(auth != null) && (root.child('isAdmin').child(auth.uid).val == true),
"$userId": {
"lastLoggedIn": {
".write": "(auth != null) && ($userId == auth.uid)
}
}
}
管理员和用户自己都可以写入 lastLoggedIn
。
我的 Firebase 数据结构看起来像
-isAdmin
-user1
isAdmin: true
-users
-user1
-firsName: Jane
-lastLoggedIn: 12 March 2017
-user2
-firstName: John
-lastLoggedIn: 11 March 2017
我希望我的管理员(用户 1)能够执行以下操作
向-users 分支添加更多用户。所以我需要以下权限(创建 user3、user4...等)
"users": {
.write: "(auth != null) && (root.child('isAdmin').child(auth.id).val == true)
}
但是我也希望非管理员用户能够更新 lastLoggedIn 条目。所以我需要以下权限
"users": {
$userId: {
"lastLoggedIn": {
.write: "(auth != null) && ($userId == auth.id)
}
}
}
问题来了,firebase 不允许嵌套规则,因为我在 users 下有一个 .write 规则,我相信 users/$userId/lastLoggedIn 下的 .write 规则将被忽略
有办法解决这个问题吗?
Firebase 安全规则不允许嵌套规则是不正确的 - 它们允许。规则级联和您需要注意的情况是,一旦授予权限,它就不能被 'nested' 规则撤销。
所以 'nested' 规则只有在更高级别的规则已经授予写入权限时才会被忽略。如果尚未授予写权限并且 'nested' 规则授予写权限,则不会被忽略。
根据这些规则:
"users": {
".write": "(auth != null) && (root.child('isAdmin').child(auth.uid).val == true),
"$userId": {
"lastLoggedIn": {
".write": "(auth != null) && ($userId == auth.uid)
}
}
}
管理员和用户自己都可以写入 lastLoggedIn
。