【问题标题】:Firebase Database - Set rules for users in the databaseFirebase 数据库 - 为数据库中的用户设置规则
【发布时间】:2020-12-29 16:53:21
【问题描述】:

现在我有了这些规则

{
    "rules": {
        "users":{
            "$uid":{
                ".write": "$uid == auth.uid",
                ".read": "auth != null && auth.uid == $uid"
                }
        }
    }
}

授权时,我沿着这条路径向数据库写入数据

在应用程序中,我想显示所有用户的电子邮件,但没有显示任何内容。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read);

        listView = findViewById(R.id.textView);
        listData = new ArrayList<>();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
        listView.setAdapter(adapter);
        mDatabase = FirebaseDatabase.getInstance().getReference();
        mAuth = FirebaseAuth.getInstance();
        getDatafromDB();
    }

    private void getDatafromDB(){
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (listData.size() > 0) listData.clear();
                for (DataSnapshot ds: dataSnapshot.child("users").getChildren()){
                    User user = ds.getValue(User.class);
                    assert user != null;
                    listData.add(user.email);
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };
        mDatabase.addValueEventListener(valueEventListener);
    }
}

如果我写初始规则,

{
    "rules": {

                ".write": "false",
                ".read": "true"

    }
}

然后显示所有内容。基于此,我得出结论,我设置的规则不正确。怎么做才对?

【问题讨论】:

  • android-studio 标签仅在您的问题与 IDE 相关时使用,仅仅因为您使用的是 android studio 并不意味着您应该将其作为标签添加到您的问题中,所以我已经删除了:)
  • 好的,现在我知道了
  • 没问题,这是一个常见的错误,祝你好运找到答案,不幸的是我无能为力:)

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


【解决方案1】:

通过如下设置规则:

{
    "rules": {
        "users":{
            "$uid":{
                ".write": "$uid == auth.uid",
                ".read": "auth != null && auth.uid == $uid"
                }
        }
    }
}

用户只能读取与他/她的用户 UID 对应的数据库节点。有关详细信息,请参阅doc


您没有详细说明要实现哪些确切的访问权限(所有用户都可以读取整个users 节点?只有经过身份验证的用户才能读取整个users 节点?等等...)但您需要相应地调整您的规则。


PS:另外,别忘了rules are not filters


根据您的评论更新

是的,如果您想检查,在您的规则中,用户已验证他/她有权访问电子邮件地址,您会这样做... auth.token.email_verified == true。有关详细信息,请参阅此doc

【讨论】:

  • 是的,我已经知道了。所有用户都必须能够读取和写入用户分支。为此,我需要设置类似这样的规则,以便经过验证的用户可以编辑分支? "auth != null && auth.token.email_verified == true"
  • 感谢“规则不是过滤器”链接。现在我明白了我的错误
  • 您好@КириллХимов,我的回答对您有帮助吗?您可以接受并投票,请参阅stackoverflow.com/help/someone-answers。谢谢。
  • 对不起,我忘了
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2017-11-18
  • 2019-07-03
相关资源
最近更新 更多