特定字段上的firebase读/写规则

特定字段上的firebase读/写规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,如果我有一个包含以下字段的数据库: name email phone position pay 有相当多的帖子展示了如何允许用户访问他们的数据,或者允许管理员访问其他人的数据,包括他们自己的数据 问题是,你如何限制firebase安全规则中的数据,允许“员工”只写姓名、电子邮件和电话,而管理员可以写所有字段,包括职位和工资 例如,如果我是一名员工,并且我了解firebase,有什么可以阻止我为“支付”注入新的金额,以便我可以更改金额?即使字段可能不显示,我也可以对整个记录进行写访问。我想限制对

如果我有一个包含以下字段的数据库:

name
email
phone
position
pay
有相当多的帖子展示了如何允许用户访问他们的数据,或者允许管理员访问其他人的数据,包括他们自己的数据

问题是,你如何限制firebase安全规则中的数据,允许“员工”只写姓名、电子邮件和电话,而管理员可以写所有字段,包括职位和工资

例如,如果我是一名员工,并且我了解firebase,有什么可以阻止我为“支付”注入新的金额,以便我可以更改金额?即使字段可能不显示,我也可以对整个记录进行写访问。我想限制对某些字段的写入权限。这可能吗

我的猜测是列出每个字段,比如:

{
"name": ".write...",
"email: ".write...", etc etc
}

或者使用.validate,但我不确定?

假设所有这些用户都在称为用户的子用户之下,并且每个用户的配置文件都有一个密钥,即他们的
auth.uid
,您可以创建一个规则,如果用户的职位被列为
admin
,或者
$user\u id
是他们自己的用户id,则用户可以写入名称类别。这样,管理员可以写入任何人的名称,用户可以写入他们自己的名称。同样,对于
pay
子项,只有
职位
等于
admin
的用户才能写入
pay
。可能看起来像这样:

{
    "users": {
        "$user_id": {
            "name": {
                ".write": "root.child('users/'+auth.uid+'/position') == 'admin' || $user_id == auth.uid"
            },
            "pay": {
                ".write": "root.child('users/'+auth.uid+'/position') == 'admin'"
            }

        }
    }
}

您只需为
电子邮件
电话
、和
位置
添加规则,假设所有这些用户都在某个子用户之下,并且每个用户的配置文件都有一个键,即其
身份验证.uid
,您可以创建一个规则,如果用户的职位被列为
admin
,或者
$user\u id
是他们自己的用户id,则用户可以写入名称类别。这样,管理员可以写入任何人的名称,用户可以写入他们自己的名称。同样,对于
pay
子项,只有
职位
等于
admin
的用户才能写入
pay
。可能看起来像这样:

{
    "users": {
        "$user_id": {
            "name": {
                ".write": "root.child('users/'+auth.uid+'/position') == 'admin' || $user_id == auth.uid"
            },
            "pay": {
                ".write": "root.child('users/'+auth.uid+'/position') == 'admin'"
            }

        }
    }
}

你只需要为
电子邮件
电话
位置
添加规则就可以了。啊,好吧,这似乎有道理,我来测试一下。谢谢我的下一个问题是,如果您有几个字段(30+)可以为任何类型的用户编写,该怎么办?您必须列出所有具有写入规则的字段,还是可以将它们全部放入某种数组/一个对象中?为此,您需要在
$user\id
下放置一个
$all
捕获所有规则。请看我几天前对这个非常类似的问题的回答:这个小技巧,特别是
$
符号表示子节点,然后声明显式字段权限非常有用。将我从代码更新中解救出来,能够将单个字段标记为始终可写。Firebase是如此光滑,而且总是越来越好!啊,好的,这似乎是有道理的,我来测试一下。谢谢我的下一个问题是,如果您有几个字段(30+)可以为任何类型的用户编写,该怎么办?您必须列出所有具有写入规则的字段,还是可以将它们全部放入某种数组/一个对象中?为此,您需要在
$user\id
下放置一个
$all
捕获所有规则。请看我几天前对这个非常类似的问题的回答:这个小技巧,特别是
$
符号表示子节点,然后声明显式字段权限非常有用。将我从代码更新中解救出来,能够将单个字段标记为始终可写。Firebase是如此光滑,而且总是越来越好!