43

这是我第一次涉足 Firebase 和 nosql,我来自 SQL 背景。

使用简单登录安全电子邮件/密码,如何限制对 Firebase 中数据的访问?例如,一些用户将有权创建业务对象(用户、客户、类别等),而其他用户则不能。有没有办法将权限列表附加到“auth”变量?

4

3 回答 3

35

没有办法将权限直接附加到 auth 变量(或者至少这似乎不是预期的策略)。我建议创建一个用户集合,auth.uid您可以在其中保留您想要的任何类型的权限属性,这样您的安全规则可能看起来像这样(未经测试):

{
  "rules": {
    ".read": true,
    "users": {
      ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'"
    }
  }
}

role属于集合中所有对象的属性在哪里users

更新

请参阅下面的评论:

“没有办法将权限直接附加到 auth 变量”这在 2017 年发生了变化。您现在可以将自定义声明附加到安全规则中可用的身份验证配置文件。有关自定义声明,请参阅 bojeil 的答案和 Firebase 文档。——弗兰克·范·普菲伦

于 2013-10-22T17:45:24.063 回答
15

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

于 2017-09-27T21:49:03.963 回答
9

Looking at this again a year later "Custom Tokens" may be a better option.

https://www.firebase.com/docs/security/guide/user-security.html#section-custom

于 2014-10-27T19:42:54.820 回答