如何在 Firebase 中设置允许写入 IF CHILD DOES NOT EXIST 的规则?

Posted

技术标签:

【中文标题】如何在 Firebase 中设置允许写入 IF CHILD DOES NOT EXIST 的规则?【英文标题】:how to set a rule in Firebase that allows writing IF CHILD DOES NOT EXIST? 【发布时间】:2021-12-28 11:49:27 【问题描述】:

如果资源不存在,则无法设置允许写入子“NEWS”的规则。 (在应用程序中,我编写了一个代码,如果它不存在,则在 Firebase 中恢复“NEWS”子项)

我尝试了几个没有意义的操作。最后一个是:


  "rules": 

    "NEWS":
       ".read": "auth.uid!==null",         
       ".write": "auth.uid!==null &&
                 !data.parent().child('NEWS').exists()",  // ! doesn't work

JAVA:阅读儿童“新闻”

REF_NEWS_FILM = FirebaseDatabase.getInstance().getReference().child(KEY_CHILD_NEWS).child(KEY_LANGUAGE).child(KEY_CHILD_NEWS_ABOUT_nameOfFilm);
ValueEventListener vel_news = new ValueEventListener() 
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) 
        if (snapshot.getChildrenCount() == 0) 

            if (FirebaseAuth.getInstance().getCurrentUser() != null) 
                String newsDefault = getResources().getString(R.string.no_news_yet);   // no news
                MyStringClass newsDefaultClass = new MyStringClass(newsDefault);
                REF_NEWS_FILM.push().setValue(newsDefaultClass);
                 else 
                Query queryNews = FirebaseDatabase.getInstance().getReference().child(KEY_CHILD_NEWS).child(KEY_LANGUAGE).child(KEY_CHILD_NEWS_ABOUT_nameOfFilm).orderByChild("text");
            queryNews.addValueEventListener(new ValueEventListener() 
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) 
                    for (DataSnapshot dss : snapshot.getChildren()) 
                        MyStringClass newsClass = dss.getValue(MyStringClass.class);
                        assert newsClass != null;
                        String newsString = newsClass.getText();
                        TV_NEWS_ABOUT_FILM.setText(newsString);
                    
                @Override
                public void onCancelled(@NonNull DatabaseError error) 
                throw databaseError.toException();   // advice from Frank
                ); 
    
    @Override
    public void onCancelled(@NonNull DatabaseError error) 
    throw databaseError.toException();   // advice from Frank
    ;
REF_NEWS_FILM.addValueEventListener(vel_news);


【问题讨论】:

安全规则只有在被代码执行后才有意义。您能否编辑您的问题以显示根据这些规则重现问题的最少代码? 1) 请不要忽略错误。至少onCancelled 应该是public void onCancelled(@NonNull DatabaseError databaseError) throw databaseError.toException(); ,这也可以让你看到你的哪些操作失败了。 2) 由于您的规则要求允许读取 auth.uid!==null,因此请确保在您的代码中通过将 if (FirebaseAuth.getInstance().getCurrentUser() != null 放在您共享的代码周围来满足此条件。 好的。谢谢弗兰克先生。我将修复代码并再次发布(为其他人) 【参考方案1】:

你应该可以使用!data.exists():


    "rules": 
        "NEWS": 
            ".read": "auth.uid!==null",
            ".write": "auth.uid!==null && !data.exists()"
        
    

为防止将null 写入其中,您可能应该扩展为还检查newData.exists()


    "rules": 
        "NEWS": 
            ".read": "auth.uid!==null",
            ".write": "auth.uid!==null && newData.exists() && !data.exists()"
        
    

【讨论】:

感谢您的回答,但它不起作用。 (在 PlayGround 中测试显示错误)

以上是关于如何在 Firebase 中设置允许写入 IF CHILD DOES NOT EXIST 的规则?的主要内容,如果未能解决你的问题,请参考以下文章

用户扫描二维码以读取和写入特定数据库节点后如何在 Firebase 中设置安全规则

无法在 android studio 中设置 firebase

如何在lua中设置文件写入函数调用的长度?

如何在 Flutter 中设置不同的 firebase 环境

如何在 Flutter Web 的 Firebase 分析中设置用户属性?

如何在 Flutter Web 项目中设置 Firebase 功能