我当前的firebase实时安全规则如下
{
"rules": {
"users": {
".read" : true,
".indexOn": ["email"],
"$user_id": {
".read": true,
".write": "auth != null && $user_id === auth.uid"
}
}
}
}
他们转换为只有经过身份验证的用户才能将数据写入到users /之下的自己的节点
但是,我们有管理员用户,他们应该能够修改非管理员用户的数据。
我们识别管理员用户的方式是用户属性isAdmin,这对于管理员用户是正确的。因此,具有管理员和非管理员用户的示例数据如下所示:
{
"users": {
"kldjjfjf" : {
"name": "vik", "isAdmin": true
},
"lfllfomr": {
"name": "neeti", "isAdmin": false
}
}
请告知处理此类用例的最佳实践是什么?进行.write true将解决该问题,但随后它将使所有人可以修改任何人的数据。
答案 0 :(得分:2)
我发现允许管理员访问的最简单方法是:
您可以使用Admin SDK向Firebase身份验证用户配置文件添加自定义声明。声明是您确定自己含义的自定义键/值对。文档中的第一个示例显示了setting a claim called admin
to true
,例如使用Node.js的Admin SDK:
admin.auth().setCustomUserClaims(uid, {admin: true}).then(() => { // The new custom claims will propagate to the user's ID token the // next time a new one is issued. });
设置了自定义声明后,它将在登录时传输到客户端,并且在安全规则中也可用。您可以使用以下方法检查以上内容:
".write": "auth != null && ($user_id === auth.uid || auth.token.admin === true)"
一个简单的替代方法是将具有特定特权的UID列表存储在用户数据库中。例如,您可能有一个顶级Admins
列表:
Admins
uidOfVik: true
uidOfPuf: true
以上表示您和我是管理员。然后,检查安全规则中的内容:
".write": "auth != null && ($user_id === auth.uid || root.child('Admins').child(auth.uid).exists())"
答案 1 :(得分:0)
这是另一种选择:
Firebase安全规则仅适用于正常连接到应用程序的客户端。
如果您有自己的后端(我不能这么认为,因为Firebase是用于无服务器计算的),那么它可以使用管理SDK连接到应用程序,而绕过安全规则。
或者,您可以为您的管理员用户创建一个单独的应用程序,该应用程序将使用admin SDK连接到firebase。