如何在 Firebase 中创建不同的用户组?

Posted

技术标签:

【中文标题】如何在 Firebase 中创建不同的用户组?【英文标题】:How to create different user groups in Firebase? 【发布时间】:2018-06-23 15:34:40 【问题描述】:

我正在使用 Xcode 制作一个销售点应用程序。

我希望此应用能够跟踪库存商品,允许用户使用条形码搜索库存、扫描库存、添加或查找库存。库存物品将存储在用户的“商店”中。

我想拥有三种类型的用户:

    经理用户,创建商店并拥有对该商店的完全访问权限。他可以管理所有“员工用户”,例如删除他们的访问权限,并且员工用户必须由他邀请才能使用唯一代码加入他的商店。他将拥有“员工用户”所不具备的特定能力,例如添加和编辑股票的能力。经理帐户的外观

    员工用户,有限制。 (例如,看不到编辑用户页面,也看不到编辑经理用户拥有的股票的选项)。员工帐户的外观

    购物者用户,只能查看商店和商店中的商品。 购物者用户帐户的外观

附加的 UI 设计应该能说明我的意思。如您所见,经理用户有一个管理员工选项卡,我希望只有他可以拥有,而其他用户没有。经理在查看库存时还可以选择了解更多详细信息,而员工用户则没有。购物者帐户只能访问两个功能,查找商店和查看商店中的库存。

所以我的问题是, 如何在 Firebase 中为我的应用编写三种不同类型的用户代码? & 如何在向其他用户显示其他选项的同时仅向他们显示我想向他们显示的选项?

【问题讨论】:

【参考方案1】:

这是一个非常广泛的主题,很大程度上取决于您如何实现应用的各个部分。以下是众多可能的答案之一,只是为了让您开始使用一些链接。

如果您的应用将其数据存储在 Firebase 数据库产品之一(Realtime Database 或 Cloud Firestore)中,或者如果它将文件存储在 Cloud Storage through Firebase 中,那么您可能希望将每个用户的角色存储为该用户个人资料中的自定义声明。

Firebase Authentication documentation shows how to set such custom claims,例如如何通过 Node.js 脚本将用户的admin 属性设置为true

admin.auth().getUserByEmail('user@admin.example.com').then((user) => 
  // Confirm user is verified.
  if (user.emailVerified) 
    // Add custom claims for additional privileges.
    // This will be picked up by the user on token refresh or next sign in on new device.
    return admin.auth().setCustomUserClaims(user.uid, 
      admin: true
    );
  
).catch((error) => 
  console.log(error);
);

同样,您可以在 role 属性中设置您的用户角色。然后,您可以检查Realtime Database、Cloud Firestore 或Cloud Storage 的服务器端安全规则(如果用户具有允许他们访问他们尝试访问的特定数据的角色)。

然后您可以在客户端代码中decode the user's token to get access to the same claims 并为他们优化 UI

【讨论】:

这就是我要找的东西,非常感谢你,弗兰克。【参考方案2】:

弗兰克的回答是正确的,但我想添加一条非常简单的附加信息。如果您将用户信息(DOB、昵称等)存储在 /users 节点中(就像许多 Firebase 应用程序所做的那样),只需在该节点中添加角色

users
  uid_0
    name: "Larry"
    role: "manager"
  uid_1
    name: "Curley"
    role: "employee"
  uid_2
    name: "Moe"
    role: "shopper"

当用户登录时,从用户节点读取他们的节点,然后应用将知道他们是什么类型的用户并显示相应的 UI。

您还可以在 Firebase 规则中利用它来控制每个角色可以访问的内容。

【讨论】:

嘿@Jay,你使用哪种方法(你的还是弗兰克的)有什么主要的优点或缺点吗? @MatthewMullin 我会说我的解决方案直到最近才更常见,并且因为它不需要任何云功能,所以更简单、更容易实现。它也可以 100% 快速完成,因为它不需要 Admin SDK。有人可能会争辩说,利用 Admin SDK 的令牌机制会“减少”资源负担。但是,它不应该存储任何其他数据 - 因此无论如何都可能会使用具有其他用户属性的 /uses 节点。我会鼓励你调查弗兰克斯的回答,因为这可能是总体上最好的方法。 澄清一下 - 在有云功能和 Admin SDK 之前,我的答案确实是“唯一”的答案。正如@frankvanpuffelen 指出的那样,现在有多种选项可以在 Firebase 应用中处理不同类型的用户。

以上是关于如何在 Firebase 中创建不同的用户组?的主要内容,如果未能解决你的问题,请参考以下文章

在firebase实时数据库中创建相同的节点

Firebase Auth (android) 后在数据库中创建用户

Flutter:使用从 Firebase 身份验证创建的帐户在 Firestore 中创建用户

未在 Firebase 中创建字符串的 Arraylist

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

在Firebase中创建用户后获取身份提供商令牌