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

Posted

技术标签:

【中文标题】Firebase 数据库 - 为数据库中的用户设置规则【英文标题】:Firebase Database - Set rules for users in the database 【发布时间】: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 并不意味着您应该将其作为标签添加到您的问题中,所以我已经删除了:) 好的,现在我知道了 没问题,这是一个常见的错误,祝你好运找到答案,不幸的是我无能为力:) 【参考方案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" 感谢“规则不是过滤器”链接。现在我明白了我的错误 您好@КириллХимов,我的回答对您有帮助吗?您可以接受并投票,请参阅***.com/help/someone-answers。谢谢。 对不起,我忘了

以上是关于Firebase 数据库 - 为数据库中的用户设置规则的主要内容,如果未能解决你的问题,请参考以下文章

Firebase会恢复单个文本数据并将其设置为textview

如何根据数据库用户 id(不是 uid)设置 firebase 规则

从 Firebase 渲染 FlatList 中的数据

从 firebase 检索数据并设置 VC 以匹配用户偏好

当请求中的 nodeId 与数据库中的 nodeId 匹配时,我可以将 Firebase 实时数据库规则设置为只读吗

新的 Flutter/Dart 程序员 有没有简单的方法可以简单地访问 Firebase 数据库中的“字段”并将其值设置为变量?