규칙은 필터가 아닙니다: Firebase "권한이 없거나 부족함"오류 수정

3892 단어 firebaserules
실험하는 동안 Firebase 특히 Cloud Firestore 내 컬렉션에 데이터를 읽고 쓸 수 있는 사람을 제어해야 하는 시점에 도달했습니다. 내가 빌드하는 애플리케이션은 클라이언트 측 애플리케이션 전용이므로 이에 대한 액세스를 제한하는 Firebase 방법은 Firebase AuthenticationCloud Firestore Security Rules .

이 블로그 게시물의 목적을 위해 flats라는 1개의 기본 컬렉션이 있다고 가정하겠습니다. 여기에는 items라는 하위 컬렉션이 포함되어 있습니다. .

문서를 읽고 몇 가지 규칙을 테스트하고 컬렉션 구조를 업데이트한 후 다음 규칙을 찾았습니다.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /flats/{flatId} {
      allow create: if request.auth != null;
      allow read, update, delete: if request.auth != null
                                  && request.auth.uid in resource.data.idsOfUsersWithAccess;

      match /items/{itemId} {
        allow create: if request.auth != null;
        allow read, update, delete: if request.auth != null
                                    && request.auth.uid in resource.data.idsOfFlatmatesThatShareThis;
      }
    }
  }
}


위의 규칙은 기본적으로 인증된 사용자( request.auth != null )가 allow 에드 create 평면, 하지만 그들은 단지 allow 에드 read , update 또는 delete 플랫의 고유 ID( request.auth.uid )가 idsOfUsersWithAccess라는 플랫 속성에 포함된 경우 플랫 .

이제 items 컬렉션은 flats의 하위 컬렉션입니다. 하나, 이전 규칙을 확장하는 중첩 규칙을 만들었습니다( rules for hierarchical data in the docs 에 대해 자세히 읽어보세요). 규칙에 따르면 인증된 사용자만 allow 에드 create 항목이지만 read , update 또는 delete 항목 사용자의 고유 ID는 idsOfFlatmatesThatShareThis 아파트의 재산.

그러나 어떤 이유로 내 앱에서 플랫 항목을 가져올 수 없었고 다음 오류가 발생했습니다.

Uncaught (in promise) FirebaseError: Missing or insufficient permissions.


내 코드와 Firebase 문서를 파헤친 후 문제를 발견했습니다. 플랫 항목을 가져오는 코드는 다음과 같습니다.

firestore.collection('flats').doc(flat.id)
         .collection('items').get()


나의 단순한 두뇌(나는 그를 브라이언이라고 부르고 싶다)는 다음과 같은 생각을 하고 있었다.

If the authenticated user queries all flat items, the result will surely only include the ones they have access too, based on the security rules that I created.



잘못된.

documentation on writing conditions for Cloud Firestore Security Rules 분명히 말한다 :

Rules are not filters. You cannot write a query for all the documents in a collection and expect Cloud Firestore to return only the documents that the current client has permission to access.



이런!

문제는 내 규칙에 없었습니다. 내 쿼리에 있었다. 추가 where 규칙과 일치하는 절로 문제가 해결되었고 이제 의도된 항목을 로드할 수 있습니다.

firestore.collection('flats').doc(flat.id)
         .collection('items')
         .where('idsOfFlatmatesThatShareThis', 'array-contains', state.user.id)
         .get()


내가 무엇을 배웠습니까?



코딩에 뛰어들기 전에 문서를 읽는 데 더 많은 시간을 할애하십시오! 또는 적어도 모든 것을 빠르게 훑어보기 ;)

추신: YouTube에서 비디오 시리즈를 완전히 추천합니다.

좋은 웹페이지 즐겨찾기