【问题标题】:How to use two firebase projects in single Android app at same time?如何在单个 Android 应用程序中同时使用两个 Firebase 项目?
【发布时间】:2021-10-14 09:36:40
【问题描述】:

我需要两个用于单个 Android 应用的 firebase 项目。一个项目是针对用户的,另一个是针对管理员的。由于某些原因,我正在使用管理员 firebase 项目。

现在我需要在管理应用程序中连接这两个项目,并且我想在管理应用程序的两个 Firebase 项目中一次添加或修改 Firestore 数据。

如何在 Android 中一次获取两个 firebase 项目的实例?

我已经看到一些关于此的 stackoverflow 问题,但他们没有同时获得两个实例。

谁能回答我的问题...

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    无需更改您的默认应用。将您的应用正常连接到主 firebase 项目。此外,将您的应用注册到第二个 firebase 项目。现在不要将google-services.json 文件导入到android 项目中,而是直接创建一个如下所示的Singleton 类并将其替换为您的第二个firebase 项目详细信息。

    public class MySecondaryProject {
        private static FirebaseApp INSTANCE;
    
        public static FirebaseApp getInstance(Context context) {
            if (INSTANCE == null) {
                INSTANCE = getSecondProject(context);
            }
            return INSTANCE;
        }
    
        private static FirebaseApp getSecondProject(Context context) {
            FirebaseOptions options1 = new FirebaseOptions.Builder()
                    .setApiKey("AI...gs")
                    .setApplicationId("1:5...46")
                    .setProjectId("my-project-id")
                    // setDatabaseURL(...)      // in case you need firebase Realtime database
                    // setStorageBucket(...)    // in case you need firebase storage MySecondaryProject
                    .build();
    
            FirebaseApp.initializeApp(context, options1, "admin");
            return FirebaseApp.getInstance("admin");
        }
    }
    

    现在,您可以在任何需要第二个项目实例的地方使用,如下所示。

      FirebaseFirestore db = FirebaseFirestore.getInstance(); //- DEFAULT PROJECT
      FirebaseFirestore secondDB = FirebaseFirestore.getInstance(MySecondaryProject.getInstance(this)); // - SECOND PROJECT
    

    您必须遵循单例模式以避免重复实例,否则应用程序将崩溃。您可以同时使用这两个实例。

    有关更多详细信息,一些有用的链接

    我认为这将是您问题的完美答案。

    【讨论】:

    • 我花了很多时间寻找这个可行的解决方案。 如果这有帮助,请点赞我的回答。
    • 它工作正常,非常感谢。
    【解决方案2】:

    简短回答:不要。

    您希望对单个项目进行基于角色的访问控制,而不是一个用于管理员的项目和一个用于用户的项目。例如,管理员可以删除文件,而用户不能。

    有一个full guide to role based access available in the Firebase docs,还有一些变体。您的规则最终可能类似于:

    service cloud.firestore {
       match /databases/{database}/documents {
         match /stories/{story} {
            function isSignedIn() {
              return request.auth != null;
            }
    
            function getRole(rsc) {
              // Read from the "roles" map in the resource (rsc).
              return rsc.data.roles[request.auth.uid];
            }
    
            function isOneOfRoles(rsc, array) {
              // Determine if the user is one of an array of roles
              return isSignedIn() && (getRole(rsc) in array);
            }
    
            function isValidNewStory() {
              // Valid if story does not exist and the new story has the correct owner.
              return resource == null && isOneOfRoles(request.resource, ['owner']);
            }
    
            // Owners can read, write, and delete stories
            allow write: if isValidNewStory() || isOneOfRoles(resource, ['owner']);
    
             match /comments/{comment} {
                // ...
             }
         }
       }
    }
    

    【讨论】:

    • 感谢您的回复@Jake Lee。我对使用 firebase 自定义 climes 实现基于角色的用户有一个想法。但在我的情况下,另一个项目不仅适用于管理员角色。它充当管理员创建的应用程序内容的数据备份,并存储有关该特定内容的一些额外机密细节。还有一些额外的原因。
    • 您所说的一切都不需要单独的项目。安全规则和角色处理所有机密性 - 我可以非常确定地说明这一点 - 我现在正在这样做。
    【解决方案3】:

    如果您只有标准用户和管理员,只需使用custom claims。不要将角色写入 Firestore。

    这将使设置更加容易,并且不会花费您在规则中进行昂贵的get 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多