如何在firebase中实现基于角色的访问控制

aco*_*e76 35 firebase firebase-security

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

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

hia*_*ttp 33

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

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

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

UPDATE

见下面的评论:

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

  • 在不了解您的应用程序要求的情况下很难知道您究竟需要什么,我只是想传达一下您如何在Firebase中管理此类"许可"的一般策略.根据您构建实际数据的方式,您可能需要或不需要多次使用该规则.你可能需要或不需要每个用户的布尔值,也许他们只有一个用户`type`字符串,比如``admin``,你就匹配了.也许只有"管理员"需要该属性,因为没有它,默认情况下权限将失败.明白了吗? (3认同)
  • "没有办法直接将权限附加到auth变量"这在2017年发生了变化.您现在可以将自定义声明附加到身份验证配置文件中,这些声明在安全规则中可用.请参阅[bojeil的答案](/sf/answers/3252042811/)和[自定义声明的Firebase文档](https://firebase.google.com/docs/auth/admin/custom-claims). (2认同)

boj*_*eil 9

Firebase通过ID令牌上的自定义用户声明启动了对任何用户基于角色的访问的支持:https://firebase.google.com/docs/auth/admin/custom-claims

您将定义管理员访问规则:

{
  "rules": {
    "adminContent": {
      ".read": "auth.token.admin === true",
      ".write": "auth.token.admin === true",
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用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.
});
Run Code Online (Sandbox Code Playgroud)

这将传播到相应用户的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


Jam*_*een 8

一年后再看一遍"Custom Tokens"可能是更好的选择.

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

  • 我可以使用自定义令牌和声明来了解客户端(Web)上的用户角色吗? (2认同)