programing

Firestore 보안 규칙: 문서에서 배열에서 사용자 ID 검색

minimums 2023. 6. 7. 22:25
반응형

Firestore 보안 규칙: 문서에서 배열에서 사용자 ID 검색

먼저, 제가 영어를 잘 못해서 죄송합니다. 모국어가 아닙니다.

파이어스토어 데이터베이스를 사용하여 파이어베이스에서 간단한 앱을 만들고 있습니다.내 앱에서 사용자는 작은 그룹의 구성원입니다.다른 사용자의 데이터에 액세스할 수 있습니다.너무 많은 문서(사용자당 하나씩, 그룹 문서의 하위 집합에서)를 쿼리하지 않기 위해 사용자의 데이터를 그룹 문서 내의 배열에 추가하기로 선택했습니다.우리 그룹의 문서는 다음과 같습니다.

{
   "name":"fefefefe",
   "days":[false,false,false,false,true],
   "members":[
       {"email":"eee@ff.com","id":"aaaaaaaa","name":"Mavireck"}, 
       {"email":"eee2@ff.com","id":"bbbbbbbb","name":"Mavireck2"}, 
   ],
}

사용자가 그룹에 있는 경우 보안 규칙을 어떻게 확인할 수 있습니까?제가 대신 물건을 사용해야 합니까?사용자를 위해 하위 컬렉션을 사용하지 않는 것이 좋습니다. 사용 가능한 할당량 한도에 너무 빨리 도달할 수 있기 때문입니다.

시간 내주셔서 감사합니다!

편집: 답변 감사합니다.개체로 변경합니다. "구성원": {uid1: {}, uid2: {}

일반적으로 다음과 같은 규칙을 작성해야 합니다.

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{documentId} {
      // works if `members` = [uid1, uid2, uid3]
      // no way to iterate over a collection and check members
      allow read: if request.auth.uid in resource.data.members;
      // you could also have `members` = {uid1: {}, uid2: {}}
      allow read: if resource.data.members[request.auth.uid] != null;
    }
  }
}

하위 컬렉션을 사용할 수도 있습니다.

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow a user to read a message if the user is in the room
    match /rooms/{roomId} {
      match /documents/{documentId} {
        allow read: if exists(/databases/$(database)/documents/documents/$(documentId)/users/$(request.auth.uid));
      }
      match /users/{userId} {
        // rules to allow users to operate on a document
      }
    }
  }
}

내가 이 코드로 그것을 만들었습니다.

동일한 사용자가 다른 컬렉션의 배열에 있는 경우 일부 사용자가 컬렉션의 일부 문서를 읽거나 쓸 수 있도록 허용

service cloud.firestore {
  match /databases/{database}/documents {
    match /repositories/{accountId} {
      allow read, write: if request.auth.uid in get(/databases/$(database)/documents/accounts/$(accountId)).data.users
    }
  }
}

다른 해결책을 제시하는 것뿐입니다.이 경우 두 개의 필드를 저장합니다.당신의 경우는 다음과 같습니다.

"membersSummary":[
  {"email":"eee@ff.com","id":"aaaaaaaa","name":"Mavireck"}, 
  {"email":"eee2@ff.com","id":"bbbbbbbb","name":"Mavireck2"}, 
],
"members": ["aaaaaaaa", "bbbbbbbb"]

저는 이것이 반드시 최적의 방법은 아니라는 것을 알고 있지만, 파이어베이스를 사용하고 있기 때문에 문서에 정규화되지 않은 데이터를 사용해도 괜찮다고 생각합니다.

나는 사용할 것입니다.members수집 쿼리 및 방화벽 규칙 필드(allow read: if request.auth.uid in resource.data.members;위의 Mike의 답변에 따르면), 그리고.membersSummaryUI에서 정보를 렌더링하거나 다른 유형의 처리에 추가 필드를 사용합니다.

uid를 키로 사용할 경우 컬렉션을 쿼리하고 해당 사용자가 구성원으로 속한 모든 문서를 나열하고 이름별로 정렬하려면 파이어베이스에 각 uid에 대해 별도의 복합 인덱스가 필요합니다. 이는 고정된 사용자 집합이 없는 한 기본적으로 앱이 손상되는 결과를 초래합니다.

액세스 제어만을 위한 추가 문서 읽기는 정말 싫지만, 두 개의 관련 필드를 추적하는 방식을 선호한다면 그렇게 하십시오.완벽한 해결책은 없습니다. 단지 장점과 단점으로 또 다른 가능성을 제공하는 것입니다.

언급URL : https://stackoverflow.com/questions/46835481/firestore-security-rules-searching-for-a-users-id-in-array-in-a-document

반응형