5

我是一名学生开发人员,在我的 Angular 应用程序中试用了新的 Firestore,但遇到了安全规则。

我想要实现的目标:

使用模板绑定在角度视图中显示 Firestore 文档。未经身份验证的用户应该可以查看该文档。

问题:

如果未经身份验证的用户尝试查看该页面,则会发生权限错误:

ERROR 错误:权限缺失或不足。在新的 FirestoreError (error.js:164)

模板文件:

<p>{{ (item | async)?.name }}</p>

component.ts 文件:

interface Profile {
   name: string;
}
...
private itemDoc: AngularFirestoreDocument<Profile>;
item: Observable<Profile>;
...
ngOnInit() {

   this.itemDoc = this.afs.doc<Profile>('profiles/0mlC8uWaKeArzk0sfIfX');
   this.item = this.itemDoc.valueChanges();
}

火场规则:

service cloud.firestore {
   match /databases/{database}/documents {
     match /{document=**} {
        allow read, write: if request.auth != null;
     }
   }
}
4

2 回答 2

8

如您所知,对 Cloud Firestore 数据的访问由安全规则控制。当您收到“权限不足错误”时,这意味着您的读取或写入已被规则拒绝。

在您的情况下,您有以下规则:

service cloud.firestore {
   match /databases/{database}/documents {
     match /{document=**} {
        allow read, write: if request.auth != null;
     }
   }
}

大致翻译成英文,这些说“只要用户登录,就允许读取或写入数据库中的任何文档”。

因此,如果您遇到错误,则表示用户未登录 ( request.auth == null)。

所以你有两个选择:

选项 1:将身份验证添加到您的应用程序

您可以将Firebase 身份验证添加到您的应用。满足您的规则的最简单的事情是匿名身份验证:

firebase.auth().signInAnonymously()
.then(function() {
   // You're signed in, reads will work
})
.catch(function(error) {
  // Handle Errors here.
  // ...
});

选项 2:更改您的安全规则

如果您希望所有用户都能够读取您的应用程序中的所有数据,您可以打开如下规则:

service cloud.firestore {
   match /databases/{database}/documents {
     match /{document=**} {
      allow read: if true;
      allow write: if request.auth != null;
      }
   }
}
于 2017-10-05T20:37:46.037 回答
2
service cloud.firestore {
   match /databases/{database}/documents {
     match /{document=**} {
      allow read;
      allow write: if request.auth != null;
      }
   }
}
于 2017-10-05T19:24:23.980 回答