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의 답변에 따르면), 그리고.membersSummary
UI에서 정보를 렌더링하거나 다른 유형의 처리에 추가 필드를 사용합니다.
uid를 키로 사용할 경우 컬렉션을 쿼리하고 해당 사용자가 구성원으로 속한 모든 문서를 나열하고 이름별로 정렬하려면 파이어베이스에 각 uid에 대해 별도의 복합 인덱스가 필요합니다. 이는 고정된 사용자 집합이 없는 한 기본적으로 앱이 손상되는 결과를 초래합니다.
액세스 제어만을 위한 추가 문서 읽기는 정말 싫지만, 두 개의 관련 필드를 추적하는 방식을 선호한다면 그렇게 하십시오.완벽한 해결책은 없습니다. 단지 장점과 단점으로 또 다른 가능성을 제공하는 것입니다.
언급URL : https://stackoverflow.com/questions/46835481/firestore-security-rules-searching-for-a-users-id-in-array-in-a-document
'programing' 카테고리의 다른 글
Handling applicationDidBeautive - "앱이 Active가 되었을 때 뷰 컨트롤러가 어떻게 응답할 수 있습니까?" (0) | 2023.06.07 |
---|---|
C(char, int)에서 포인터 교환 (0) | 2023.06.07 |
GCC에 대한 "-Wl, option"과 "-Xlinker option" 구문 사이에 차이점이 있습니까? (0) | 2023.06.07 |
Vuex 유휴 커밋/버퍼 상태 변경 (0) | 2023.06.07 |
모든 iOS(iPhone/iPad/Apple Watch) 장치에 대한 iTunes Connect 스크린샷 크기 (0) | 2023.06.02 |