这是我第一次涉足Firebase& amp; nosql,我来自SQL背景。
使用简单登录安全电子邮件/密码,如何限制对Firebase中数据的访问?例如,某些用户将有权创建业务对象(用户,客户,类别等),而其他用户则不会。有没有办法将权限列表附加到“auth”变量?
答案 0 :(得分:33)
没有办法将权限直接附加到auth变量(或者至少看起来不是预期的策略)。我建议创建一个由auth.uid
组织的用户集合,您可以在那里保留您想要的任何类型的权限属性,这样您的安全规则可能会像这样(未经测试):
{
"rules": {
".read": true,
"users": {
".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'"
}
}
}
role
是属于users
集合中所有对象的属性。
<强>更新强>
见下面的评论:
“没有办法直接将权限附加到auth变量”这在2017年发生了变化。您现在可以将自定义声明附加到身份验证配置文件中,这些声明在安全规则中可用。有关自定义声明,请参阅bojeil的答案和Firebase文档。 - 弗兰克范普弗伦
答案 1 :(得分:8)
一年后再看一遍&#34; Custom Tokens&#34;可能是一个更好的选择。
https://www.firebase.com/docs/security/guide/user-security.html#section-custom
答案 2 :(得分:8)
Firebase通过ID令牌上的自定义用户声明启动了对任何用户基于角色的访问的支持:https://firebase.google.com/docs/auth/admin/custom-claims
您将定义管理员访问规则:
{
"rules": {
"adminContent": {
".read": "auth.token.admin === true",
".write": "auth.token.admin === true",
}
}
}
使用Firebase Admin SDK设置用户角色:
// Set admin privilege on the user corresponding to uid.
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.
});
这将传播到相应用户的ID令牌声明。
您可以在user.getIdToken(true)
要从客户端上的令牌解析它,您需要对ID令牌的有效负载进行base64解码:https://firebase.google.com/docs/auth/admin/custom-claims#access_custom_claims_on_the_client
您可以根据需要升级/降级用户。如果您有定期更改用户访问级别的脚本,他们还提供了一种列出所有用户的编程方式:https://firebase.google.com/docs/auth/admin/manage-users#list_all_users