firebase - Firestore规则: validate data does not have field

标签 firebase google-cloud-firestore firebase-security

因此,我目前为所有用户分配了两个角色:isAdmin 和 isReader。

管理员可以读写数据,读者可以读取数据。

当某人创建帐户时,他没有任何权利。甚至isReader也没有。只有管​​理员可以更改规则。

这就是我计划这样做的方式:

一旦有人创建帐户,我就会在 Users 集合中创建一个文档,如下所示:

uid: user.uid,
email: user.email,
role: {
    isAdmin: false,
    isReader: false,
}

每次登录时,我都会更新“电子邮件”和uid,但保持角色不变。为了确保这种行为,我有以下规则:

match /Users/{userId} {
  allow read: if isOwner(userId) || isAdmin();
  allow create: if request.resource.data.hasAll(['uid', 'email', 'role']) && request.resource.data.role.isAdmin == false && request.resource.data.role.isReader == false;
  allow update: if resource.data.role == null || isAdmin();
}

function isAdmin() {
  return getUserData().role.isAdmin == true;
}

我认为我有两个错误:

  1. 由于某种原因,data.hasAll(['uid', 'email', 'role']) 不起作用。当我删除这部分时,create 规则按计划工作。

  2. resource.data.role == null 不起作用。我打算检查数据是否包含 role 的任何更新,因为我不能允许它,因为它不是来自管理员。但由于某种原因它不起作用。

你知道我做错了什么吗?另外,我的策略是否保存,或者是否有人可以“破解”自己的读者或管理员权限?

最佳答案

这看起来可能是自定义身份验证声明的一个很好的用例。您可以在安全环境中为用户设置特定角色,如 this codelab 中所示。 。以下是在服务器中设置自定义声明的示例。您甚至可以使用云功能来实现此目的。我建议您查看 Codelab 的完整代码,以便了解如何确保不是任何人都可以请求将自定义声明添加到其用户。

admin.auth().setCustomUserClaims(uid, {Admin: true}).then(() => {
// The new custom claims will propagate to the user's ID token the
// next time a new one is issued.
});

然后您可以在安全规则中检查用户的这些角色。

service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow read: if request.auth.token.Owner == true || request.auth.token.Admin == true;
      allow create: request.auth.uid == userId && 
      request.resource.data.uid == request.auth.uid &&
      request.resource.data.email != null;
      allow update: request.auth.uid == userId || request.auth.token.Admin == true;
    }
  }
}

请注意,所有有关“角色”的规则已被删除,因为不再需要它们。如果您对实现有疑问,请告诉我,因为这是一个很常见的问题,我正在尝试围绕此制作更多内容。

关于firebase - Firestore规则: validate data does not have field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52262195/

相关文章:

javascript - 如何在 then 语句中定义 firebase 云函数触发器

ios - 将 Firebase 添加到 Pod 项目

ios - 使用唯一键数组搜索 Firebase 查询

angular - Firestore 从 Angular ​​获取单个数据

php - 如何配置 Firebase 安全规则以仅允许来自 CURL/PHP 源的写入?

java - 关于 "Error: Type com.google.firebase.iid.zzav is referenced as an interface from com.google.firebase.messaging.zzd"的想法?

Cloud Firestore 的 Firebase 规则限制最大文档数

firebase - 如何在 Firestore 中存储有关集合的元数据?

firebase - 删除用户后,Firebase身份验证未吊销?

angularjs - AngularFire:注销后仍然可以访问数据