Firebase 安全规则检查孩子的唯一值#AskFirebase

Posted

技术标签:

【中文标题】Firebase 安全规则检查孩子的唯一值#AskFirebase【英文标题】:Firebase security rules to check unique value of a child #AskFirebase 【发布时间】:2017-01-02 02:50:09 【问题描述】:

我的firebase数据库的结构如上图。如何确保网址唯一且没有重复?由于这些是 url,我不能直接将它们用作路径,因此我不得不将它们用作值。所以像this 这样的解决方案将不起作用。

【问题讨论】:

【参考方案1】:

如果您希望某些内容在 Firebase 数据库中是唯一的,则应将其存储为密钥。这会自动保证唯一性。

如您所述,某些字符不能用于键中。在这种情况下,您需要对值进行编码以允许在键中使用它确保您不会丢失使值唯一的信息。一个非常简单的例子是当有人想要在数据库中存储一个唯一的电子邮件地址时。由于密钥不能包含. 字符,因此我们需要对其进行编码。一种常见的编码方式是将. 替换为,

users: 
  "uidOfPuf": 
    name: "Frank van Puffelen",
    email: "puf@firebaseui.com"
  
,
emailAddresses: 
  "puf@firebaseui,com": "uidOfPuf"

在涉及电子邮件地址时,使用, 特别方便,因为电子邮件地址不能包含,

但总的来说,重要的是编码值“合理地保证是唯一的”并且您仍然将实际值存储在某个地方(例如上面的/users/$uid/email)。

对于 URL 编码,我会从去除所有非法字符开始:

var url = "http://***.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase";
ref.child(url.replace(/[\.\/]/g, '')).set(url);

商店:

"http:***comquestions39149216firebase-security-rules-to-check-unique-value-of-a-child-askfirebase": "http://***.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"

更新:我正在考虑是否对密钥使用简单的哈希码,这会导致密钥长度更合理:

// from http://***.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery
String.prototype.hashCode = function()
    var hash = 0;
    if (this.length == 0) return hash;
    for (i = 0; i < this.length; i++) 
        char = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash; // Convert to 32bit integer
    
    return hash;


var url = "http://***.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase";

ref.child(url.hashCode()).set(url);

导致:

20397229: "http://***.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"

【讨论】:

我希望存在更好的解决方案,因为通过这种方法,我将不得不替换非法字符,将长度减少到 768 字节和 UTF-8 编码。所有这一切,同时确保它是独一无二的。到目前为止,创建某种 hashid 似乎是一个不错的选择。非常感谢您的回复。 不客气。我实际上需要类似的内部工具,所以我也在寻找一种从 URL 获取合理密钥的方法。

以上是关于Firebase 安全规则检查孩子的唯一值#AskFirebase的主要内容,如果未能解决你的问题,请参考以下文章

检查firebase子项是不是具有特定值[重复]

Firebase 安全规则:.indexOn 唯一 ID

Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据

检查唯一用户名时 Firebase 权限被拒绝

Firebase 实时数据库,安全规则 - 检查其他节点

使用为每个用户生成的唯一密钥限制 Firebase 数据库规则。 (安卓工作室)