【问题标题】:Firebase/Firestore users access and roles how it works?Firebase/Firestore 用户访问和角色它是如何工作的?
【发布时间】:2021-06-15 18:55:42
【问题描述】:

我试图弄清楚角色系统如何与 Firebase 一起工作,但我非常困惑,不明白它是如何工作的。

我想我明白,要为用户分配角色,您必须使用 Firebase Admin SDK 或 Firestore 上的安全规则。

但是我不明白其中的区别以及为什么一个会比另一个更有效率以及它是如何工作的。

例如:

我有一个只有两个角色的送货应用程序:送货员和管理员

投递员有一个移动应用程序,指示应投递包裹的地址。

管理员可以访问与移动应用程序上的送货员相同的界面,但可以访问网络应用程序来管理送货。他可以添加送货、司机等...

Firebase 身份验证如何工作以及如何正确使用角色分配?

在他登录后立即调用“用户”数据库以了解他是管理员还是普通用户?

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    这个问题的答案有点大,所以我不能为它提供代码 sn-ps。但我可以指出一个具有“原子”角色系统的示例项目。您可以查看here

    基础知识。您可以将用户的角色保存在数据库(RTDB 或 Firestore)中。如果您需要两个数据库在两者之间同步它们以拥有单一系统。

    要点是每个用户只能读取他自己的角色,如果他是管理员。 对该数据的更改只能使用 Firebase 云功能。 要检查用户是管理员还是具有角色,请对经过身份验证的用户进行简单的“存在”检查,以及他是否存在相应的角色或管理员状态。

    在 firestore 中,您甚至可以拥有像这里这样的辅助函数:

    
        //Checks if user is signed in
        function isSignedIn() {
          return request.auth.uid != null;
        }
    
        //Checks if user has admin rights
        function isAdmin() {
          return exists(/databases/$(database)/documents/admins/$(request.auth.uid))
        }
    
        //Checks if user has a specific grant
        function hasGrant(grant) {
          return  get(/databases/$(database)/documents/user_grants/$(request.auth.uid)).data[grant]==true
        }
    
        //Checks if user is granted either as admin or with a grant
        function isGranted(grant){
          return isAdmin() || hasGrant(grant);
        }
    
    
        //Checks if user has specific UID
        function isOwner(userUid){
          return request.auth.uid == userUid 
        }
    

    有些人会说使用customClaims,但我绝不会推荐。也许只是为了管理员身份而不是更多。它们的尺寸很小,可以在它们上拥有任何更大的角色系统。通过将角色存储到数据库中,您甚至可以实时更改它们。

    要获取用户的角色和管理员状态,只需为该数据创建一个实时侦听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多