标签: firebase-security-rules

Cloud Firestore安全规则仅允许从Firebase功能进行写入

我真的希望能够通过仅允许firebase函数写入特定集合来保护我的firestore db ......我将如何去做?看那里的文档我找不到任何可能说明你怎么做的东西.例如,我正在寻找类似的东西:

service cloud.firestore {
  match /databases/{database}/documents {

    // Match any document in the 'cities' collection
    match /cities/{city} {
      allow read;
      allow write: if <from firebase function>;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-functions google-cloud-firestore firebase-security-rules

21
推荐指数
1
解决办法
3633
查看次数

Firestore安全规则:更新时request.resource.data.<prop>会发生什么?

我的团队最近讨论过这个问题,似乎无法确定实际/预期的行为:

如果您有以下安全规则:

match /categories/{document=**} {
    allow update: if request.auth.uid != null
    && request.resource.data.firstName is string
    && request.resource.data.lastName is string;
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下数据从前端到/ categories /创建更新语句:

{
   firstName: 'A valid firstName'
}
Run Code Online (Sandbox Code Playgroud)

那么安全规则应该通过还是失败?

参考文档中,它说

开发人员提供的数据显示在request.resource.data中,这是一个包含字段和值的映射.资源中存在的请求中未提供的字段将添加到request.resource.data

相关问题:

  1. 这是否意味着成功/失败取决于节点中的现有数据?
  2. 如果有人尝试使用安全规则中未指定的数据进行更新,即会发生什么情况 {age: 28}
  3. 验证更新数据的推荐方法是什么?

问题3有更多细节(架构问题) 假设你有这样的模型:

interface Category {
  firstName: string;
  lastName: string;
  age?: int;
  groupId?: string;
}
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个像这样的安全规则:

match /categories/{document=**} {
    allow update: if request.auth.uid != null
    && request.resource.data.firstName is string
    && request.resource.data.lastName is string;
    && request.resource.data.age is int;
    && request.resource.data.groupId is string; …
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-firestore firebase-security-rules

14
推荐指数
1
解决办法
3409
查看次数

公共和私有字段的Firestore安全规则

对于Firebase实时数据库的安全规则,公共和私有数据都可以使用如下规则存在于同一树中.

但是,在使用Firestore时,它似乎无法让我们这样做,因为我们可以检索的数据只是在集合或文档下.当公共和私人数据在同一文档中定义并获取带有收集/文档的数据时,如果我们不是所有者,我们会收到私有数据权限不足的错误.

使用RTDB时,我们可以获取'users/{userId}/publicInfo'的数据,因为我们对收集/文档一无所知.

有什么方法可以使用Firestore来实现RTDB吗?否则,我们应该分开公共/私人收藏?

// rule of Firebase Realtime Database
"users": {
   "$user_id": {
       ".read": "auth.uid === $user_id",
       ".write": "auth.uid === $user_id",

       "private": {
          ".read": "auth.uid === $user_id"   // --- private data
       }

       "public": {
          ".read": "auth !== null";           // --- public data 
       }
   }
}

// Firestore
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {

      match /{private=**} {
        allow read, write: if request.auth == userId;
      }

      match /{public=**} {
        allow read, write: if request.auth != null;
      }
    } …
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-firestore firebase-security-rules

12
推荐指数
1
解决办法
5431
查看次数

Firestore安全规则get()无法正常工作

在firestore中,如果用户teamid在文档中提到的那样,我希望用户只访问文档.现在我有一个不同的集合teams,我将用户映射为{ user_id = true }.所以我在Firestore规则中有以下内容

return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)

现在,此规则不起作用,并且未能通过前端向数据库发出任何请求.但当我$(resource.data.teamid)用我的实际teamid值替换如下,

return get(/databases/$(database)/documents/teams/234234jk2jk34j23).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)

......它按预期工作.

现在我的问题是我resource是以错误的方式使用resource,get()还是exists()在Firestore规则中不支持或查询?

编辑 完整规则如下

service cloud.firestore {
  match /databases/{database}/documents {

    function isTeamMember() {
        return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
        // return exists(/databases/$(database)/documents/teams/$(resource.data.teamid));
    }

    match /{document=**} {
        allow read, write: if isTeamMember();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您注意到注释掉的规则,exists()则在这种情况下也不起作用.

google-cloud-firestore firebase-security-rules

12
推荐指数
1
解决办法
695
查看次数

文档字段的Firestore规则

我正在Firestore中努力为文档设置安全规则。使用RTDB可以为特定对象属性设置规则,而我正尝试使用Firestore进行设置。

RTDB代码:

"users": {
    ".read": true,
    ".indexOn": ["profile/name"],
    "$uid": {
        ".read": "auth != null",
        ".write":
            "$uid === auth.uid && !data.exists()",
        "profile": {
            "birthday": {
                ".write": "$uid === auth.uid"
            },
            "name": {
                ".write": "$uid === auth.uid"
            },
            "banned": {
                ".write": "root.child('admins').child(auth.uid).exists()"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Firestore中的相同代码下方:

service cloud.firestore {
    match /databases/{database}/documents {
        match /users/ {
            allow read
            match /{$user} {
                allow read: if request.auth.uid != null
                allow write: if request.auth.uid == request.resource.id &&  exists(/databases/$(database)/documents/users/$(request.resource.id)) === false

                match /birthday {
                    allow write: …
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-firestore firebase-security-rules

12
推荐指数
1
解决办法
6029
查看次数

使用规则禁用Firebase Cloud Firestore中的查询集合

我正在使用Firebase Cloud Firestore,我想修改我的规则以限制用户查询集合.

这不应该被允许:

firestore().collection("users").get()
Run Code Online (Sandbox Code Playgroud)

但是应该允许这样做:

firestore().collection("users").doc("someUserId").get()
Run Code Online (Sandbox Code Playgroud)

目前,我的规则如下:

match /users/{userId} {
    allow read;
}
Run Code Online (Sandbox Code Playgroud)

但是此规则允许查询"用户"集合.

如何允许单个文档获取,但不允许收集查询?

javascript firebase google-cloud-firestore firebase-security-rules

10
推荐指数
1
解决办法
974
查看次数

Firebase电子邮件说我的实时数据库有不安全的规则

我最近收到来自firebase的电子邮件,告诉我我的实时数据库有不安全的规则.这些是我设定的规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
 }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个安全的规则吗?

电子邮件/密码是我启用的唯一登录方式.

firebase firebase-authentication firebase-realtime-database firebase-security-rules

9
推荐指数
2
解决办法
2909
查看次数

如何在Cloud Firestore安全规则中实施写入速率限制?

我有一个使用Firebase SDK直接从应用程序内部与Cloud Firestore对话的应用程序。我的代码确保仅以合理的间隔写入数据。但是恶意用户可能会从我的应用程序中获取配置数据,并使用它将无尽的数据流写入我的数据库。

我如何确保用户每隔几秒钟只能写一次发言,而不必编写任何服务器端代码。

google-cloud-firestore firebase-security-rules

9
推荐指数
1
解决办法
485
查看次数

Firebase规则通配符和子对比

我正在尝试将Firebase的Rule通配符与子项比较混合使用.

我正在读一个价值为'4'的孩子.

当我进行文字比较时,模拟器会给我绿灯(如下所示):

{
  "rules": {
    "die": {
      "rolls": {
        "$i": {
          ".read": "4 == root.child('die/i').val()"
        }
      },
      "i": {
        ".read": true,
        ".write": true
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出(成功):

Type    read
Location    /die/rolls/4
Data    null
Auth    null
Read successful
Line 7 (/die/rolls/4)
read: "4 == root.child('die/i').val()"
Run Code Online (Sandbox Code Playgroud)

但是通配符比较失败了.为什么?

{
  "rules": {
    "die": {
      "rolls": {
        "$i": {
          ".read": "$i == root.child('die/i').val()"
        }
      },
      "i": {
        ".read": true,
        ".write": true
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出(失败):

Type    read
Location    /die/rolls/4
Data    null
Auth …
Run Code Online (Sandbox Code Playgroud)

real-time wildcard firebase firebase-realtime-database firebase-security-rules

8
推荐指数
1
解决办法
312
查看次数

Firebase数据库规则允许更新但阻止创建

如何使用"允许更新但不允许添加新记录"来设置数据库规则?

我尝试在下面模拟,但不起作用..

我的数据:

{
  users:{
    -randomID001:{
      email:user@email.com,
      status:active
    },
    -randomID002:{
      email:user2@email.com,
      status:inactive
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在控制台中模拟:

{
  "rules": {
    ".read": "auth != null",
    "users":{
      ".indexOn": "email",
      ".write":"!newData.exists() && data.exists()" 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果新记录不存在且现有记录存在,这行代码显示允许写入的意思?

".write":"!newData.exists() && data.exists()" 
Run Code Online (Sandbox Code Playgroud)

以下是我提交的测试数据:

{
  "randomID001":{"status":"inactive"}
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Simulated update denied
Run Code Online (Sandbox Code Playgroud)

请指教.

firebase firebase-realtime-database firebase-security-rules

8
推荐指数
1
解决办法
747
查看次数