【问题标题】:Angular FirebaseError Missing or Insufficient PermissionsAngular FirebaseError 缺少或权限不足
【发布时间】:2021-12-01 12:14:51
【问题描述】:

我正在尝试允许每个用户使用 Firestore 读取和写入他们自己的数据,但我遇到了权限不足的错误。我不知道为什么。

我为我的 Firestore 制定了这些规则...

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
      match /users/{uid} {
        allow create: if request.auth != null;
        allow read, write, update, delete: if request.auth != null && request.auth.uid == uid;
      }
  }
}

在我的项目中,我的服务使用以下函数将数据推送到 angular firebase(是的,这很长)...

constructor(private afs: AngularFirestore){}


addToOrders(artist: string, formInput: AlbumInput) {
    const currentUser = this.authService.currentUser; // uses a getter function to obtain the current user
    const trackingUrl = 'https://tools.usps.com/go/TrackConfirmAction_input?strOrigTrackNum=';
    const newOrder: Order = {
      artistName: artist, 
      album: formInput.selectedAlbum.name, 
      image: formInput.selectedAlbum.images[0].url, 
      orderType: formInput.orderType, 
      trackingUrl: trackingUrl,  
      variant: formInput.variant
    }

    if (formInput.orderType === "shipped") {
      newOrder.trackingNum = formInput.trackingNum;
      
      return of(this.afs.doc(`users/${currentUser.uid}`).collection('shipped').add(newOrder))
        .subscribe({
          next: (() => {
            this.albumAdded$.next(true);
          }), 
          error: (() => {
            this.albumAdded$.next(false);
          })
        });
    } else {
      newOrder.date = formInput.date;

      return of(this.afs.doc(`users/${currentUser.uid}`).collection('preordered').add(newOrder))
        .subscribe({
          next: (() => {
            this.albumAdded$.next(true);
          }), 
          error: (() => {
            this.albumAdded$.next(false);
          })
        });
    }
  }

我在此模式中是否缺少任何会导致此类错误的内容?

如果我将规则更改为 users/${user=**},它确实将数据成功存储到 users 子集合中,但现在我无法正常登录(出于某种原因,尽管方法几乎相同)。这是我的登录信息...

signIn(signInForm: SignInForm) {
        return this.afAuth.signInWithEmailAndPassword(signInForm.email, signInForm.password)
        .then((result) => {
            this.isUserData.next(true);
            this.setUserData(result.user!)
                .then(() => {
                    this.router.navigateByUrl("/home");
                });
        }).catch(error => {
            this.errorModal(error); // Modal Generic launches to inform the user
        });
    }

设置用户数据...

setUserData(user: User) {
        const userRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${user.uid}`);
        const userData: User = {
            uid: user.uid,
            email: user.email,
            displayName: user.displayName
        }
        return userRef.set(userData, {
            merge: true
        });
    }

【问题讨论】:

    标签: javascript angular google-cloud-firestore firebase-security angularfire


    【解决方案1】:

    这条规则:

    match /users/{uid} {
    

    允许用户阅读他们自己的个人资料文档。它确实不允许让他们读取那里的子集合,这就是您在这段代码中所做的:

    of(this.afs.doc(`users/${currentUser.uid}`).collection('shipped').add(newOrder))
    

    若要允许用户同时阅读其个人资料文档的所有子集合,请使用recursive wildcard (**):

    match /users/{uid=**} {
    

    【讨论】:

    • 看起来它可以将数据添加到用户的子集合中,但现在我尝试正常登录时出现错误。我更新了上面的问题。
    • 如果此更改允许您将数据存储在子集合中,听起来它解决了您发布的问题。之后可能会有更多问题,但最好将这些问题作为一个单独的问题与他们自己的MCVE 一起发布(包括错误消息,我没有立即在您的编辑中看到。
    猜你喜欢
    • 2022-01-15
    • 2022-01-25
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多