Firebase 实时数据库规则。只有创建者才能读取数据

问题描述 投票:0回答:1

这是我的数据库:

{
  "categories": {
    "c-NgA8_ZDjEur3HowEFVD": {
      "create_date": 1696699144485,
      "creator": "Codw8lfHuDcUox1Xe4ima15OGXi1",
      "delete_date": "",
      "description": "Am Abend ein schönes Nachtessen",
      "title": "Nachtessen",
      "update_date": ""
    }
  },
  "ideas": {
    "i-NgAD6p5s8G5rJWAQo48": {
      "category": "c-NgA8_ZDjEur3HowEFVD",
      "create_date": 1696700333404,
      "creator": "Codw8lfHuDcUox1Xe4ima15OGXi1",
      "delete_date": "",
      "description": "Essen im Vito in Zürich",
      "title": "Essen im Vito",
      "update_date": ""
    }
  }
}

这是我的规则:

{
  "rules": {
    "categories": {
      ".indexOn": ["creator"],
      "$category_id": {
        ".read": "data.child('creator').val() === auth.uid",
        ".write": "!data.exists()"
      }
    },
    "ideas": {
      ".indexOn": ["creator"],
      "$idea_id": {
        ".read": "data.child('creator').val() === auth.uid",
        ".write": "!data.exists()"
      }
    }
  }
}

反应打字稿代码:

 const categoriesRefOrdered = query(
        categoriesRef,
        orderByChild('creator'),
        equalTo(account.uid),
      );
      const unsubscriber = onValue(categoriesRefOrdered, (snapshot) => {
        const val: CategoriesObjectType = snapshot.val();
        if (val) {
          const array = objectToArray(val);
          dispatch(initCategories(array));
        } else {
          dispatch(initCategories(null));
        }
      });

我在没有 $category_id 行的情况下尝试了相同的操作。

“creator”字符串是用户的uid。我的尝试是只让创建者读取他的数据。

我尝试用这个进行调试:

模拟结果 询问详情

{
  "auth": {
    "uid": "Codw8lfHuDcUox1Xe4ima15OGXi1",
    "token": {
      "sub": "Codw8lfHuDcUox1Xe4ima15OGXi1",
      "firebase": {
        "sign_in_provider": "password"
      },
      "email": "",
      "email_verified": false
    }
  },
  "resource": {
    "key": "value"
  },
  "path": "/categories",
  "method": "get",
  "time": "2023-10-09T13:07:39.316Z",
  "isAdmin": false
}

结果详情 5号线(/类别) 读取:“data.child('creator').val() === auth.uid”

firebase-realtime-database firebase-authentication firebase-security
1个回答
0
投票

您的代码尝试从数据库中的

categories
路径读取数据,但您的安全规则不会授予任何人对该路径的读取访问权限 - 因此规则拒绝查询。

安全地查询数据,您需要这样的东西:

{
  "rules": {
    "categories": {
      ".indexOn": ["creator"],
      ".read": "auth.uid !== null &&
            query.orderByChild === 'creator' &&
            query.equalTo === auth.uid",
      ...

现在规则允许用户读取

categories
,只要
creator
上的过滤器具有与自己的 UID 相同的值,您的代码似乎就是这样做的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.