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

Posted

技术标签:

【中文标题】如何在 Firebase 中实现基于角色的访问控制【英文标题】:how do I implement role based access control in firebase 【发布时间】:2013-10-31 11:39:04 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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


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

其中role 是属于您的users 集合中所有对象的属性。

更新

请看下面的评论:

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

【讨论】:

感谢您的回复。我很清楚,您建议我向每个用户记录添加一个布尔值,以指示他们是否有权访问他们正在访问的资源。那是对的吗?我是否需要为每种类型的业务对象(用户、客户、类别等)创建类似的规则? 在不了解您的应用要求的情况下,很难知道您究竟需要什么,我只是想传达您如何在 Firebase 中管理这种类型的“权限”的一般策略。根据您构建实际数据的方式,您可能需要也可能不需要多次使用该规则。你可能需要也可能不需要每个用户的布尔值,也许他们只有一个用户type 字符串,比如"admin",你就可以匹配。也许只有“管理员”需要该属性,因为没有它,默认情况下特权将失败。明白我的意思了吗? 很好的解释! @hiattp 这太完美了!正是我想要的。对我帮助很大 “无法将权限直接附加到 auth 变量” 这在 2017 年发生了变化。您现在可以将自定义声明附加到安全规则中提供的身份验证配置文件。请参阅bojeil's answer 和Firebase documentation for custom claims。【参考方案2】:

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

【讨论】:

【参考方案3】:

一年后再次查看“自定义令牌”可能是更好的选择。

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

【讨论】:

这种方法很漂亮。感谢提及! 我可以使用自定义令牌并声称知道客户端(Web)上的用户角色吗?

以上是关于如何在 Firebase 中实现基于角色的访问控制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 应用程序中实现基于角色的菜单访问列表

如何在 Firebase 中创建基于角色的访问控制或自定义声明

AngularJS中实现权限控制 - 基于RBAC

如何在 Spring Boot 中实现基于角色权限的系统

如何在微服务架构中实现基于角色的安全性

授权服务如何在基于角色的微服务架构中实现所有权检查