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

Android:实时Firebase规则

秦炜
2023-03-14

我想知道如何确保我的规则。我试着使用auth。uid!=读取和写入时为空。

但是,如果一个新用户试图登录或创建新帐户,它将不会成功,并且会拒绝授予我权限。

我想保护用户的安全,并仅限制用户本人及其数据的读取:

我试着使用auth。uid!=空但已经注册的用户将无法登录,新用户无法创建帐户。所以我必须让它成为公众写作和阅读的现实。有解决办法吗?

cuz甚至auth.uid!=null,认证用户可以读取所有用户的整个数据,而不仅仅是他自己

这是我的规则副本:

{
  "rules": {
    ".write": "root.child('Admins').child(auth.uid).exists()",
    "Admins": {
      ".read": true,
      ".write": false
    },
    "Users": {
      ".read": true,
        ".write": true 
    },
    "PrivateWork": {
      ".read": "auth.uid != null",
        ".write": false
    },
    "Likes": {
      ".read": "auth.uid != null",
        ".write": "auth.uid != null"
    },
    "Work": {
      ".read": "auth.uid != null",
        ".write": false
    },
    "videos": {
      ".read": "auth.uid != null",
        ".write": false
    }
  }
}

注册活动:

//Check if num already exist
binding.continueBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (binding.phoneNumBox.getText().toString().isEmpty()) {
            binding.phoneNumBox.setError(getString(R.string.please_enter_phone));
        } else if (binding.phoneNumBox.getText().toString().length() < 6) {
            binding.phoneNumBox.setError(getString(R.string.enter_valid_phone));
        } else {
        DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("Users");
        userRef.orderByChild("phoneNumber")
                .equalTo(binding.phoneNumBox.getText().toString())
                .addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.getValue() != null) {
                            Toast.makeText(RegPhoneNumActivity.this, getString(R.string.already_exist), Toast.LENGTH_SHORT).show();
                        } else {
                                Intent intent = new Intent(RegPhoneNumActivity.this, OTPActivity.class);
                                intent.putExtra("phoneNumber", binding.phoneNumBox.getText().toString());
                                startActivity(intent);
                            }
                        }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
        }
    }
});

后勤活动:

//Check if num already exist
binding.loginContinueBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (binding.loginPhoneNumBox.getText().toString().isEmpty()) {
            binding.loginPhoneNumBox.setError(getString(R.string.please_enter_phone_numb));
        } else if (binding.loginPhoneNumBox.getText().toString().length() <= 6) {
            binding.loginPhoneNumBox.setError(getString(R.string.plaese_enter_valid_phone_num));
        } else {
            userRef.orderByChild("phoneNumber")
                    .equalTo(binding.loginPhoneNumBox.getText().toString())
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.getValue() != null) {
                                Intent intent = new Intent(PhoneLoginActivity.this, LoginVerifyPhoneActivity.class);
                                intent.putExtra("phoneNumber", binding.loginPhoneNumBox.getText().toString());
                                startActivity(intent);
                            } else {
                                Toast.makeText(PhoneLoginActivity.this, getString(R.string.phone_num_doesnt_exist), Toast.LENGTH_SHORT).show();
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
        }
    }
});

共有1个答案

洪开诚
2023-03-14

要允许用户只读取自己的数据,您需要:

  1. 使用用户的UID作为其节点的密钥

对于意味着您的用户节点的规则如下:

"Users": {
  "$uid": {
    ".read": "$uid === auth.uid"
  }
},

然后访问它的代码变成:

userRef.child(FirebaseAuth.getInstance().getCurrentUser().getUID())
       .addListenerForSingleValueEvent(new ValueEventListener() {

虽然也可以根据数据库中节点的值检查登录用户的电话号码,但用户也必须已经登录。如果是这样,请查看有关安全查询数据的文档。

 类似资料:
  • 我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询:

  • 我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606

  • 我有一个数据库: 当用户()在应用程序中注册时,他会填充另一个用户uid(该用户uid具有属性)并将自己的uid添加到他的个人资料中(

  • 更新2019-11-03:添加了错误的实时最小复制。在Chrome中加载链接后,点击ctrl shift i并选择控制台以查看输出。我已经尽力确保这正是我最初的项目代码所做的;我们看看情况是否如此,嗯?碎片的规则文件与下面的原始帖子相同。该源代码可在GitHub上获得。 原文: 这些规则在模拟器中工作,但在我真正的网络应用程序中不工作。模拟器路径和有效负载与下面数据库日志输出中显示的相同。 (将两

  • 如果我在公共模式下使用Firebase实时数据库发布我的Android应用程序会怎么样,因为我不需要任何身份验证。它说 公共访问使您的数据库对任何人开放,即使是不使用您的应用的人,因此请务必在设置身份验证时再次限制您的数据库。 我不清楚,如果他们的应用程序没有连接到我的数据库,而且他们也没有firebase帐户的登录密码,那么他们怎么能访问我的数据库。 提前发送Thx

  • 我有一个关于firebase实时数据库规则的问题。 有人创建了一个帐户,该帐户在实时数据库中创建了一个路径: 结构很简单(密钥、用户ID和其他数据)。 这是我的规则: 但现在问题来了。如何允许用户写入此对象?每个拥有代码的人(请参阅BQUyhq)w3D)都可以写入对象id。如果没有代码,他们就无法写入对象id。 有可能发生这样的事吗?如果是的话,我该怎么做呢。