Firebase数据库-为数据库中的用户设置规则

时间:2020-09-11 07:17:21

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

现在我有了这些规则

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

授权时,我会沿着该路径将数据写入数据库enter image description here

在应用程序中,我想显示所有用户电子邮件,但是什么也没显示。

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"

    }
}

然后将显示所有内容。基于此,我得出的结论是我错误地设置了规则。怎么做对呢?

1 个答案:

答案 0 :(得分: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