繁体   English   中英

如何在单个 Android 应用程序中同时使用两个 firebase 项目?

[英]How to use two firebase projects in single Android app at same time?

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

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

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

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

谁能回答我的问题...

无需更改您的默认应用程序。 将您的应用正常连接到主 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

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

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

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

简短的回答:不要。

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

Firebase 文档中提供了基于角色的访问完整指南,以及一些变体。 您的规则最终可能类似于:

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} {
            // ...
         }
     }
   }
}

如果您只有标准用户和管理员,只需使用自定义声明 不要将角色写入 Firestore。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM