现在我有了这些规则
{
"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"
}
}
然后将显示所有内容。基于此,我得出的结论是我错误地设置了规则。怎么做对呢?
答案 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。