【问题标题】:DatabaseError: Permission denied firebaseDatabaseError:权限被拒绝firebase
【发布时间】:2018-03-06 01:01:44
【问题描述】:

我是 Firebase 的新手。我想在我的应用程序中使用 firebase 读取/写入数据,但是当我尝试这样做时,我收到了这个 DatabaseError: Permission denied 错误。

firebase 上的规则文件

{

"rules": {
    "sos":{
          ".read":"auth != null",
          ".write":"auth != null"
          }
}
}

代码文件

        Firebase authFirebaseRef = new Firebase(ApiConstants.FIREBASE_MY_URL);
        authFirebaseRef.authWithCustomToken(AppConstants.FBT, authResultHandler);

Firebase.AuthResultHandler authResultHandler = new Firebase.AuthResultHandler() {
    @Override
    public void onAuthenticated(AuthData authData) {
        Log.v("onAuthenticated", authData.getUid());
        addEvents();
    }

    @Override
    public void onAuthenticationError(FirebaseError firebaseError) {
        Log.v("onAuthenticationError= ", "FirebaseError= " + firebaseError.toString());
    }
};

private void addEvents() {

    mFirebaseDatabase = mFirebaseInstance.getReference("sos").child("emergencyservices");
    mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            emergencyServicesList.clear();
            for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) {
                Log.v("onDataChange", ":" + dataSnapshotChild.child("emergencyServicesName").getValue());
                EmergencyServiceModel emergencyServiceModel = new EmergencyServiceModel();
                emergencyServiceModel.setEmergencyServiceId(dataSnapshotChild.child("emergencyServicesId").getValue().toString());
                emergencyServiceModel.setEmergencyServiceName(dataSnapshotChild.child("emergencyServicesName").getValue().toString());
                emergencyServicesList.add(emergencyServiceModel);
            }
            loadDataToRecyclerView();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.v("DatabaseError", databaseError.getMessage());
        }
    });
}

之前我通过将.true 保留到read/writesos/emergencyservices 中添加了一些记录。但现在我必须通过身份验证来更改它。

【问题讨论】:

  • 您是否启用了从控制台登录?
  • @akshay_shahane 是的,我已经做到了
  • 更新规则后,您是否已将 googleservices.json 替换为新的?
  • 能否给我一个链接,其中提到了这一步?

标签: android firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

在附加监听器之前,您需要确保用户已登录。由于您已经在侦听身份验证状态,因此只需将附加侦听器的代码移动到 onAuthenticated 回调中:

Firebase.AuthResultHandler authResultHandler = new Firebase.AuthResultHandler() {
    @Override
    public void onAuthenticated(AuthData authData) {
        Log.v("onAuthenticated", authData.getUid());
        addEvents();

        mFirebaseDatabase = mFirebaseInstance.getReference("sos").child("emergencyservices");
        mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                emergencyServicesList.clear();
                for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) {
                    Log.v("onDataChange", ":" + dataSnapshotChild.child("emergencyServicesName").getValue());
                    EmergencyServiceModel emergencyServiceModel = new EmergencyServiceModel();
                    emergencyServiceModel.setEmergencyServiceId(dataSnapshotChild.child("emergencyServicesId").getValue().toString());
                    emergencyServiceModel.setEmergencyServiceName(dataSnapshotChild.child("emergencyServicesName").getValue().toString());
                    emergencyServicesList.add(emergencyServiceModel);
                }
                loadDataToRecyclerView();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.v("DatabaseError", databaseError.getMessage());
            }
        });
    }

    @Override
    public void onAuthenticationError(FirebaseError firebaseError) {
        Log.v("onAuthenticationError= ", "FirebaseError= " + firebaseError.toString());
    }
};

【讨论】:

  • 感谢您的回复。是的,我也在做同样的事情。请查看编辑后的代码
  • 嗯....不知道发生了什么。错误消息应该告诉你它失败的位置。
  • getDetails() 给出相同的信息权限被拒绝
  • 你能提供你的日志信息(都与这个问题有关)吗?
  • Permission denied 是唯一的消息,我明白了
【解决方案2】:

那么,您是否在 Firebase 控制台中启用了所需的登录方法

【讨论】:

  • 是的,我使用自定义 JWT firebase 集成做到了
  • 你确定,onAuthenticated()方法被调用了吗?
  • 是的,它被调用了。
【解决方案3】:

我认为您使用不同的 firebase 对象进行身份验证,使用不同的对象进行查询。
试试这个

authFirebaseRef.getRoot().child("sos/emergencyservices"‌​).addValueEventListe‌​ner(new ValueEventListener() { ... }; 

而不是

mFirebaseDatabase = mFirebaseInstance.getReference("sos").child("emergencyservic‌​es");
mFirebaseDatabase.addValueEventListener(new ValueEventListener() { ... };

另外,您使用的是旧版本的 firebase API。我推荐你这个link。该文档将指导您将现有 Firebase.com 应用升级到新的 Firebase 控制台和 API。

【讨论】:

  • 请仔细阅读文件。升级到新的火力基地将使您的工作更轻松、更高效,并在技术上得到更新。而且,您还会发现大量资源。
  • 好的。再次感谢您
【解决方案4】:

截至 2018 年底,我们还有一个“权限被拒绝”错误的来源。

Google 刚刚推出 Cloud Firestore BETA。

关键是它的界面与 Firebase 相同,只有一个下拉选择器可以分隔两个数据库...

用了 8 小时的错误,终于发现默认的控制台视图是 Cloud Firestore BETA 视图,而不是 Firebase。

因此,在我配置 Cloud Firestore BETA 时,我的应用与 Firebase 进行了通信。

8h 输了 .... 谢谢 Google ...

【讨论】:

  • 这也是我的问题,在我为实时数据库而不是云存储配置规则之后。
【解决方案5】:

它与数据库有关,因此在firebase控制台中进入数据库并将规则设置为true以进行读/写

【讨论】:

    猜你喜欢
    • 2018-12-12
    • 2019-04-27
    • 2021-02-21
    • 2020-02-15
    • 2017-12-26
    相关资源
    最近更新 更多