Android Firebase-登录到不同项目上的多个实时数据库

Android Firebase-登录到不同项目上的多个实时数据库,firebase,firebase-realtime-database,firebase-authentication,Firebase,Firebase Realtime Database,Firebase Authentication,我有一个主要的Firebase Relatime数据库,用户可以登录和访问数据。 我也有一些其他的数据库,我希望他们能够登录到以及 因此,他们的想法是使用电子邮件和密码登录到“数据库A”,然后在菜单中有一个选项可以查看来自另一个“数据库B”和“数据库C”的报告 当我尝试切换数据库时,权限被拒绝。确切的错误是: 侦听/用户失败:数据库错误:权限被拒绝 我正在尝试从/users路径获取用户列表 现在的问题是,虽然用户使用相同的电子邮件和密码存在于所有数据库中,但我认为这对firebase来说并不重要

我有一个主要的Firebase Relatime数据库,用户可以登录和访问数据。 我也有一些其他的数据库,我希望他们能够登录到以及

因此,他们的想法是使用电子邮件和密码登录到“数据库A”,然后在菜单中有一个选项可以查看来自另一个“数据库B”和“数据库C”的报告

当我尝试切换数据库时,
权限被拒绝
。确切的错误是:

侦听/用户失败:数据库错误:权限被拒绝

我正在尝试从
/users
路径获取用户列表

现在的问题是,虽然用户使用相同的电子邮件和密码存在于所有数据库中,但我认为这对firebase来说并不重要,因为
UID
是不同的。那么,我怎样才能用同一个用户毫无顾忌地登录到多个项目,或者这是可能的

以下是我目前掌握的情况:

private void switchDatabase(AvailableDatabase selectedDatabase) {
    Log.d(TAG, String.format(Locale.ENGLISH, "Switching DB: Name: %s, ID: %s, URL: %s", selectedDatabase.getName(), selectedDatabase.getApplicationId(), selectedDatabase.getUrl()));

    if (selectedDatabase.getApplicationId() == null || selectedDatabase.getUrl() == null) {
        Snackbar.make(findViewById(android.R.id.content), "Invalid DB Connection for " + selectedDatabase.getName(), Snackbar.LENGTH_SHORT).show();
        return;
    }

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setApplicationId(selectedDatabase.getApplicationId())
            .setApiKey(getResources().getString(R.string.google_api_key)) // Required for Auth.
            .setDatabaseUrl(selectedDatabase.getUrl()) // Required for Realtime DB.
            .build();

    //Get secondary DB.
    // First try get by name, in case it already exists.
    // If that fails, create it
    FirebaseApp app;
    try {
        app = FirebaseApp.getInstance(selectedDatabase.getName());
    } catch (IllegalStateException e) {
        Log.d(TAG, "Firebase DB " + selectedDatabase.getName() + " doesn't exist. Creating...");
        app = FirebaseApp.initializeApp(this, options, selectedDatabase.getName());
    }


    FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(app);
    secondaryDatabase.getReference().child(FB_USER).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //do stuff
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Snackbar.make(findViewById(android.R.id.content), "DB request cancelled:getUsers::" + databaseError.getMessage(), Snackbar.LENGTH_SHORT).show();
        }
    });
}
以下是适用于/用户的firebase规则:

"users" : {
    ".read" : "auth != null && (root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 1' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 2'|| root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 3' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 4')", 
    ".write" : "auth != null && (root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 1' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 2'|| root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 3' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 4')"
 },
如您所见,它们与
auth.uid
绑定。如果我来自另一个项目,用户电子邮件将是相同的,但自动生成的UID不会是相同的,因此权限失败,因为
auth.UID
不存在

谢谢。

简单地说:

// Retrieve other app.
FirebaseApp otherApp = FirebaseApp.getInstance("otherApp");
// Get the database for the other app.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);
请在此处阅读更多信息:

对于使用Firebase的Android应用程序,有一个中心FirebaseApp对象 它管理所有Firebase API的配置。这是 当您的应用程序运行时,由内容提供商自动初始化 启动,您通常不需要与之交互。然而, 当您想从单个应用程序访问多个项目时,您将 需要一个独特的FirebaseApp来单独引用每个应用程序。它是 由您来初始化除默认值以外的实例 Firebase为您创造了一个全新的平台。例如,连接到默认的 Firebase数据库实例,我们隐式使用默认的Firebase 应用程序:

要从另一个项目连接到另一个Firebase实时数据库, 您首先需要为另一个实例初始化FirebaseApp实例 Firebase项目,并给它一个标识符-在本例中 “中学”:

API,但这次指定要通过哪个项目访问 将相关FirebaseApp传递给FirebaseDatabase.getInstance():

简而言之:

// Retrieve other app.
FirebaseApp otherApp = FirebaseApp.getInstance("otherApp");
// Get the database for the other app.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);
请在此处阅读更多信息:

对于使用Firebase的Android应用程序,有一个中心FirebaseApp对象 它管理所有Firebase API的配置。这是 当您的应用程序运行时,由内容提供商自动初始化 启动,您通常不需要与之交互。然而, 当您想从单个应用程序访问多个项目时,您将 需要一个独特的FirebaseApp来单独引用每个应用程序。它是 由您来初始化除默认值以外的实例 Firebase为您创造了一个全新的平台。例如,连接到默认的 Firebase数据库实例,我们隐式使用默认的Firebase 应用程序:

要从另一个项目连接到另一个Firebase实时数据库, 您首先需要为另一个实例初始化FirebaseApp实例 Firebase项目,并给它一个标识符-在本例中 “中学”:

API,但这次指定要通过哪个项目访问 将相关FirebaseApp传递给FirebaseDatabase.getInstance():


是的,这似乎是关于这个话题的唯一在线资源。但是,它不完全满足我的需要(即浏览独特的UID)。谢谢。是的,这似乎是关于这个话题的唯一在线资源。但是,它不完全满足我的需要(即浏览独特的UID)。谢谢。是的,这是我用来获取初始代码的URL。不过,我在提交用户的
UID
时遇到了问题。谢谢。你带过来是什么意思?因为查找登录用户uid非常简单。在数据库中创建一个用户。生成了一个唯一的ID。现在想象一下在第二个数据库中创建相同的用户。将创建另一个唯一ID。这些显然不匹配,因此当我从DB2请求路径时,例如/users//profile/email,它将找不到它,因为
UID
不同。由于身份验证提供程序相同,firebase身份验证的UID对于用户来说保持不变。我将并排查看我的2个数据库,并且用户具有不同的UID。我不明白它们怎么会是一样的,因为它们只是在两个不同时间为任意对象创建的JSON字段。我没有使用Google/Facebook的SSO表单。是的,这是我用来获取初始代码的URL。不过,我在提交用户的
UID
时遇到了问题。谢谢。你带过来是什么意思?因为查找登录用户uid非常简单。在数据库中创建一个用户。生成了一个唯一的ID。现在想象一下在第二个数据库中创建相同的用户。将创建另一个唯一ID。这些显然不匹配,因此当我从DB2请求路径时,例如/users//profile/email,它将找不到它,因为
UID
不同。由于身份验证提供程序相同,firebase身份验证的UID对于用户来说保持不变。我将并排查看我的2个数据库,并且用户具有不同的UID。我不明白它们怎么会是一样的,因为它们只是在两个不同时间为任意对象创建的JSON字段。我没有使用谷歌/Facebook的SSO表单。
FirebaseOptions options = new FirebaseOptions.Builder()
       .setApplicationId("1:530266078999:android:481c4ecf3253701e") // Required for Analytics.
       .setApiKey("AIzaSyBRxOyIj5dJkKgAVPXRLYFkdZwh2Xxq51k") // Required for Auth.
       .setDatabaseUrl("https://project-1765055333176374514.firebaseio.com/")
// Required for RTDB.
       .build();
FirebaseApp.initializeApp(this /* Context */, options, "secondary"); Then, you can access the database using the same client
// Retrieve my other app.
FirebaseApp app = FirebaseApp.getInstance("secondary");
// Get the database for the other app.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(app);