Javascript 如何强制用户仅将Firebase中特定文件的文件上载到特定节点。

Javascript 如何强制用户仅将Firebase中特定文件的文件上载到特定节点。,javascript,firebase,firebase-authentication,firebase-security,firebase-storage,Javascript,Firebase,Firebase Authentication,Firebase Security,Firebase Storage,我正在试用firebase存储,看看授权用户可以从web客户端上传文件,我想知道是什么通过调整javascript阻止用户更改路径 考虑以下几点 我想按如下方式组织用户文件 root : { users : uid1 : images {} : audio {} -users: uid2 : images {} : audio {} -users:

我正在试用firebase存储,看看授权用户可以从web客户端上传文件,我想知道是什么通过调整javascript阻止用户更改路径

考虑以下几点

我想按如下方式组织用户文件

root : {
     users :
            uid1 : images {}
                 : audio {}
    -users:
            uid2 : images {}
                 : audio {} 
    -users:
          : uid3 : images {}
                 : audio {} 
     }
然后将图像上载到/userid/images/

        var storage     = firebase.storage();
        var storageRef  = storage.ref();
        var imagesRef   = storageRef.child(uid_g).child('images').child(path);
问题:

是什么阻止用户将子项(“图像”)更改为子项(“音频”)

我只是想确保我设置的路径不会在存储上更改

服务器Im上的规则只允许用户读写数据

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/<your-firbase-storage-bucket>/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

您可以继续使用安全规则创建进一步的路径限制:

service firebase.storage {
  match /b/<your-firbase-storage-bucket>/o {
    match /user/{userId} {
      match /images {
        // This will match only /user/{userId}/images
        allow read, write: if imageCondition();
      }
      match /audio {
        // If you don't want the user to change to audio, you can either say if false or just don't include this path
        allow read, write: if audioCondition();
      }
    }
  }
}
service firebase.storage{
匹配/b//o{
匹配/user/{userId}{
匹配/图像{
//这将只匹配/user/{userId}/images
允许读、写:如果imageCondition();
}
匹配/音频{
//如果您不希望用户更改为音频,您可以说If false或不包含此路径
允许读、写:如果audioCondition();
}
}
}
}

您可以继续使用安全规则创建进一步的路径限制:

service firebase.storage {
  match /b/<your-firbase-storage-bucket>/o {
    match /user/{userId} {
      match /images {
        // This will match only /user/{userId}/images
        allow read, write: if imageCondition();
      }
      match /audio {
        // If you don't want the user to change to audio, you can either say if false or just don't include this path
        allow read, write: if audioCondition();
      }
    }
  }
}
service firebase.storage{
匹配/b//o{
匹配/user/{userId}{
匹配/图像{
//这将只匹配/user/{userId}/images
允许读、写:如果imageCondition();
}
匹配/音频{
//如果您不希望用户更改为音频,您可以说If false或不包含此路径
允许读、写:如果audioCondition();
}
}
}
}

需要澄清的是,服务器上检查的是哪个用户ID?在javascript上有“firebase.auth().currentUser.u”和“firebase.auth().onAuthStateChanged(function(user)”两个选项,其中“user.uid”给出了另一个选项,但它们并不相同。除非您刚刚更改了身份验证状态(升级了匿名帐户、登录/注销等)。如果调用
firebase.auth().currentUser.uid
onAuthStateChanged
中,我希望与
user.uid
匹配,是不是没有发生这种情况?不,它们是不同的,只是在不同的用户上尝试过。“firebase.auth().currentUser.u”和“firebase.auth().currentUser.uid”也不同。你的意思是
firebase.auth().currentUser.u
firebase.auth().currentUser.uid
(您键入的值是
u
的两倍,所以我不确定)。只是为了澄清一下,服务器上检查的是哪个用户ID?在javascript上有“firebase.auth().currentUser.u”和“firebase.auth().onAuthStateChanged”(函数(用户)”其中有“user.uid”给出了另一个,但它们不相同。除非您刚刚更改了身份验证状态(升级了匿名帐户、登录/注销等),否则它们不应该不同。如果您调用
firebase.auth().currentUser.uid
onAuthStateChanged
中,我希望与
user.uid
匹配,是不是没有发生这种情况?不,它们是不同的,只是在不同的用户上尝试过。“firebase.auth().currentUser.u”和“firebase.auth().currentUser.uid”也不同。你的意思是
firebase.auth().currentUser.u
firebase.auth().currentUser.uid
(您键入的值是
u
的两倍,所以我不确定)。