首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的消防安全规则不能像预期的那样起作用?

为什么我的消防安全规则不能像预期的那样起作用?
EN

Stack Overflow用户
提问于 2021-04-20 12:55:19
回答 1查看 142关注 0票数 0

我想让用户在我的应用上编辑他们的文章。如果它们的uid与存储中文件夹的名称匹配,则可以编辑它们的帖子。

这里是我的防火墙存储的安全规则:

它说如果我想要(users/gafspL9sdVSOXVkxYNlqzxyDbvG2/listingPhotos/lXOxKS1N8dFefzai5H2B/R158bed9819e4fccf7e18a5eeeaf79c6b.png),我可以删除这个图像

然后,当我尝试编辑清单:

我得到了403个错误。它未授权的用户,实际上它会将此错误抛给GET函数,甚至连删除部分也不会。

正如您在上面看到的,我目前已登录,并且我的uid是正确的。

错误:( mydomainname?prefix=users%2FgafspL9sdVSOXVkxYNlqzxyDbvG2%2FlistingPhotos%2FlXOxKS1N8dFefzai5H2B%2F&delimiter=%2F xhrio_network.ts:70获取403号)

,这是我要访问的文件夹:

我的文件夹设置: mybucket/users/{userUID}/listingPhotos/{listingID}/picture.jpg

伙计们,有什么问题吗?我可能有错误的代码行,但模拟显示没有问题,所以我有点困惑。

谢谢!

编辑

当用户想要编辑他们的列表时,我更新存储在防火墙中的列表细节,然后删除存储在firebase存储文件夹中的所有照片,然后上传新的一批照片。

下面是我更新列表细节和删除现有照片的地方:

代码语言:javascript
复制
 function editListingData() {
    setLoading("loading");
    db.collection("listings")
      .doc(listingID)
      .set(
        {
          title: title,
          category: category,
          condition: condition,
          description: description,
          price: price,
          sellingFormat: sellingDetails,
          shippingPrice: shippingPrice,
          listingPhotos: [],
        },
        { merge: true }
      )
      .then(() => {
        const storageRef = firebase
          .storage()
          .ref()
          .child(
            `users/` +
            auth.currentUser.uid +
            `/listingPhotos/` +
            listingID +
            `/`
          );
        storageRef.listAll().then((listResults) => {
          const promises = listResults.items.map((item) => {
            console.log("deleting item: ", item.name)
            return item.delete();
          })
          Promise.all(promises).then(
            onUploadSubmission()
          ).catch((error => console.log("error deleteing files", error)));
        });
      })
      .then(() => {
        setLoading("complete");
        setTimeout(() => {
          history.push("/l/" + listingID)
        }, 2000);
      })
      .catch((error) => {
        console.log("firebase error: " + error);
        setLoading("error");
      });
  }

下面是我上传新照片的地方,然后将它们的下载new放到消防局文档中,这样以后我就可以轻松地获取它们了:

代码语言:javascript
复制
  function onUploadSubmission() {
    if (photos != []) {
      const promises = [];
      var listingREF = db.collection("listings").doc(listingID);
      photos.forEach((photo, index) => {
        if (photo.fileType.includes('image')) {
          console.log("current photo to upload: ", photo, "index: ", index)
          const uploadTask = firebase
            .storage()
            .ref()
            .child(
              `users/` +
              auth.currentUser.uid +
              `/listingPhotos/` +
              listingID +
              `/${"photo" + index}`
            )
            .put(photo.file);
          promises.push(uploadTask);
          uploadTask.on(
            firebase.storage.TaskEvent.STATE_CHANGED,
            (snapshot) => {
              const progress =
                (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
              if (snapshot.state === firebase.storage.TaskState.RUNNING) {
                console.log(`Progress: ${progress}%`);
              }
            },
            (error) => console.log(error.code),
            async () => {
              const downloadURL = await uploadTask.snapshot.ref.getDownloadURL();
              listingREF.update({
                listingPhotos: firebase.firestore.FieldValue.arrayUnion(
                  {
                    url: downloadURL,
                    index: index
                  }
                ),
              });
            }
          );
        }
      });
      Promise.all(promises)
        .then(() => setCreatedListing(false))
        .catch((err) => console.log(err.code));
    } else {

    }
  }

编辑2

所以我想要实现的是:

用户可以编辑自己的照片(列出照片和个人资料图片)

要做到这一点,将:

photo/s.

  • When
  1. 选择他们的新
  2. ,他们点击提交,防火墙将删除当前存储在防火墙存储中的照片。
  3. ,然后它将上传新照片的用户之前选择。
  4. 下载的网址,然后被复制到列表文件在消防局,这样我们可以很容易地查看他们以后

用于存储的安全规则是:

  • 任何人都可以读取用户照片(类似于eBay,无论您是否登录)
  • 用户只能将(删除、更新、创建)写入(删除、更新、创建)自己的文件夹。每个文件夹都是以用户UID命名的。只有当当前登录的用户UID与存储中的文件夹的名称匹配时,它们才能访问这些文件夹。
EN

回答 1

Stack Overflow用户

发布于 2021-04-20 18:07:02

在get()方法上收到的错误是由于该位置的规则缺乏在该目录中读取的任何权限所致。规则从上到下级联,虽然上面有一个读取,但这只适用于指定的路径users/{userUID}

一旦解决了这个问题,我们就可以继续进一步调试了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67179390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档