C# Firebase实时数据库规则-安全功能

C# Firebase实时数据库规则-安全功能,c#,firebase-realtime-database,firebase-security,C#,Firebase Realtime Database,Firebase Security,在我的数据库中,我有以下结构 /玩家/UID{1,2,3,…n}/对于每个UID==>{Child1,Child2,…Childn} 在规则中,为了保护数据,我在两个孩子之间创建了一个类似于下面的函数,但是,写入操作任务出现故障,我不知道原因。此外,您能否提出一些更安全、更实用的实施方案 { "rules": { ".read": "auth != null", ".write": "auth != null && newData.child('Child1'

在我的数据库中,我有以下结构

/玩家/UID{1,2,3,…n}/对于每个UID==>{Child1,Child2,…Childn}

在规则中,为了保护数据,我在两个孩子之间创建了一个类似于下面的函数,但是,写入操作任务出现故障,我不知道原因。此外,您能否提出一些更安全、更实用的实施方案

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null && newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000 === newData.child('Child2').val()"
  }
}
我的简化写函数如下所示,其中Child2是Child1的函数

public void WriteDatabase(float child1, int child2)
    {
        if (AuthController.Instance != null && AuthController.Instance.user != null)
        {
            uid = AuthController.Instance.user.UserId;
        }
        else
        {
            return;
        }
        LeaderBoardEntry entry = new LeaderBoardEntry(child1, child2);

        Dictionary<string, System.Object> entryValues = entry.ToDictionary();
        Dictionary<string, System.Object> childUpdates = new Dictionary<string, System.Object>();
        childUpdates["/Players/" + uid + "/"] = entryValues;
        reference.UpdateChildrenAsync(childUpdates).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                UnityEngine.Debug.Log("Write database cancelled");
                return;
            }

            if (task.IsFaulted)
            {
                UnityEngine.Debug.Log("Write database faulted");
                return;
            }

            if (task.IsCompleted)
            {
                UnityEngine.Debug.Log("Write database completed");
            }
        });
    }

您的规则设置为验证写入根目录的数据:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null && 
       newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000
        === newData.child('Child2').val()"
  }
}
因此,这允许任何经过身份验证的用户写入一个值,该值将特定公式与数据库的根相匹配

但是您的代码正在将相同的结构写入/Players/$uid,这是数据库中的不同位置

您需要确保在数据库中的正确位置定义这些验证规则:

{
  "rules": {
    ".read": "auth != null",
    "Players": {
      "$uid": {
        ".write": "auth != null && 
           newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000
            === newData.child('Child2').val()"
      }
    }
  }
}

请编辑您的问题以显示。我编辑了,谢谢您的评论。我们无法知道child1和child2在这里是什么。请确保代码最小且完整,这意味着我们可以独立运行它,而不需要您的问题中没有的任何内容。首先,感谢您的帮助,Frank,更好地表示我的数据库结构。经过多次尝试后,我意识到,由于浮动变量未被识别为数字且计算不起作用,错误被拒绝。。。我创建了另一个整数变量来检查它,它就像一个符咒:如果我需要,我如何在规则中得到1.002的值作为数字来进行计算。val以字符串的形式获取,我猜..val获取节点的值,无论它存储在何处。如果你存储了一个数字,它就会得到一个数字。我模模糊糊地回忆起一些关于浮点数的事情,但无法立即找到一些关于浮点数的事情。如果你能重现这个问题,我建议你用一个简单的句子开始一个问题。请确保以文本形式包含最小值、代码、JSON和规则,以便于他人根据您共享的内容进行复制。
{
  "rules": {
    ".read": "auth != null",
    "Players": {
      "$uid": {
        ".write": "auth != null && 
           newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000
            === newData.child('Child2').val()"
      }
    }
  }
}