当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库规则不允许对经过身份验证的用户进行写入

陈正业
2023-03-14

我对Firebase实时数据库规则有意见。我向mAuth注册了一个新用户。createUserWithEmailAndPassword(电子邮件,密码)。在onCompleteMethod中,我想在实时数据库中添加我自己的用户对象。我这样做是因为每个用户都有额外的电子邮件/密码信息。

我检查完之后

FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
if(fireUser == null) {
    //do something
} else {
    createNewUser(fireUser);
}

方法

private void createNewUser(FirebaseUser fireUser) {
        // Build the user-object.
        User user = new User();
        user.setUserId(fireUser.getUid());
        user.setUsername(name);
        user.setSex(sex);
        user.setEmail(email);
        user.setAge(time);
        user.setImageUri("");

        // Create database connection and reference.
        DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference();
        mDatabaseRef.child("users").child(fireUser.getUid()).setValue(user);
    }

它叫。但出于某种原因,会抛出此数据库错误:

W/RepoOperation: setValue at /users/9i6loj4BlCWkgkXOULWxbCSlvnx1 failed: DatabaseError: Permission denied

根据我的理解,如果Firebase用户不是null,那么他已经登录,因此我的规则在Firebase中声明

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

将允许用户写入数据库。但是,当我将规则更改为”时,此代码才起作用。阅读:“true”。编写:“true”

所以我的问题是:我做错了什么?我只想让经过身份验证的用户读/写。

感谢任何帮助!

编辑

@Override
 public void onComplete(@NonNull Task<AuthResult> task) {
     if (!task.isSuccessful()) {
         loadingPanel.setVisibility(View.GONE);
     } else {
         loadingPanel.setVisibility(View.GONE);
         FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
         if(fireUser == null) {
             Toast.makeText(getApplicationContext(), "User is null", Toast.LENGTH_SHORT).show();
         }

         // Send verification mail
         sendVerificationEmail(fireUser);

         // Create a new User!
         createNewUser(fireUser);

         //start intent and sign out.
         Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
         FirebaseAuth.getInstance().signOut();
         startActivity(intent);
         finish();

    }
}

共有1个答案

钦良弼
2023-03-14

数据库写入不会同步完成。您在数据库操作完成之前注销:

     //start intent and sign out.
     Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
     FirebaseAuth.getInstance().signOut();  // <== Can't do this here!
     startActivity(intent);
     finish();

createNewUser()中,可以向setValue()调用添加一个带有日志语句的CompletionListener,以查看写入何时完成。您还可以添加一个带有log语句的AuthStateListener,以检测登录/注销何时完成。在完成这些日志之前,DB应确认这些日志已被注销。

 类似资料:
  • 我当前的Android应用程序使用Firebase实时数据库。 我正在与安全规则作斗争,因为我希望只允许单个用户写入数据,同时允许任何经过身份验证的用户读取数据。 我制定了这些规则,但不确定它们是否足够安全。。。 其中“XXXXXXXXXXXXXXXXXXXX”是我希望允许写入数据的指定用户。 用户的uid是常量值吗? 在测试新规则时,单击“模拟”按钮时,“验证”选项管理什么?

  • 我有一个firebase实时数据库,具有读/写功能,但是我没有任何用户,也不打算对用户进行身份验证。数据由事件侦听器和调度器(java)编写,我的html ui应用程序应该只读取数据。 我应该如何保护我的db? 在开发(不安全)模式下,我可以使用任何http客户端来写/读数据?如何在保护身份验证后通过身份验证?

  • 我正在使用Firebase实时数据库编写一个应用程序。有了这个应用,你可以创建视频,然后可以与任何人共享。我使用Firebase匿名身份验证。 我不希望用户需要注册或登录。所以这些投票是完全匿名的。实时数据库有以下规则: 据我所知,这意味着只有使用我的应用程序(为他们创建了匿名ID)的人才能读写数据库,对吗? 或者有没有其他方法可以让用户不用应用程序访问数据库?

  • 目标:用户应可以访问已登录用户的文档。 集合结构: 我使用的Android代码 我尝试过的数据库规则: 我收到的错误: com.google.firebase.firestore。FirebaseFirestoreException:PERMISSION_DENIED:缺少权限或权限不足。 侦听查询(目标 = 查询(按名称的根顺序);limitType=LIMIT_TO_FIRST) 失败:状态{

  • 我是Spring安全的新手,我想用数据库验证用户。我已经用jdbc创建了一个登录页面和一个身份验证提供程序,它检查用户是否存在于数据库中。但是我的代码没有这样做的问题是,它允许所有用户登录!我的代码怎么了?谢谢你的帮助。 这是我的安全会议。xml:

  • 我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下: 规则: 示例数据库: 以下是确切的错误: