Tôi muốn lưu trữ nếu người dùng được phép đọc tài liệu trong chính tài liệu, dựa trên địa chỉ email của người dùng. Nhiều người dùng phải có quyền truy cập vào cùng một tài liệu.Quy tắc bảo mật Firestore dựa trên giá trị bản đồ
Theo the documentation Firestore không cho phép truy vấn thành viên mảng. Đó là lý do tại sao tôi lưu trữ địa chỉ email của người dùng trong Bản đồ chuỗi-Bool với địa chỉ email làm khóa.
Ví dụ sau tôi không sử dụng email làm khóa bản đồ, vì nó đã không hoạt động với chuỗi cơ bản.
Cấu trúc cơ sở dữ liệu trông giống như rằng:
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
Tất cả các quy tắc bảo mật được liệt kê ở đây:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
Edit: Nó cũng không làm việc nếu tôi sử dụng match /lists/{listId}
thay vì match /lists/{listId=**}
Tôi hiểu điều đó như thế nào, quy tắc bảo mật này sẽ cho phép truy cập đọc cho mọi người nếu giá trị trong bản đồ shared[test]
là đúng.
Đối completness vì: Đây là câu hỏi tôi đang sử dụng (Kotlin trên Android):
collection.whereEqualTo("shared.test", true).get()
.addOnCompleteListener(activity, { task ->
if (task.isSuccessful) {
Log.i("FIRESTORE", "Query was successful")
} else {
Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
}
})
Tôi đoán rằng tôi không thể truy cập các giá trị bản đồ từ các quy tắc an ninh. Vì vậy, những gì sẽ là một giải pháp thay thế cho vấn đề của tôi?
Trong Firestore rules reference, văn bản có thể được truy cập như vậy resource.data.property == 'property'
vì vậy, tôi đang làm gì sai?
Tất cả các ví dụ tôi đã thấy cho resource.data không có cú pháp ** wildcard, vì vậy có thể resource.data chỉ hoạt động nếu bạn sử dụng 'match/lists/{listId}' thay vì 'match/lists/{listId = **} '? Một cái gì đó đáng thử. – Scarygami
Không, thật không may điều này cũng không hoạt động –
Hmmm ... Tôi sẽ thành thật; Điều này có vẻ như điều này sẽ được làm việc tốt. Trước tiên bạn có thể kiểm tra kỹ rằng bạn đã không vô tình lưu trữ dữ liệu của mình/chỉnh sửa quy tắc của mình trong Cơ sở dữ liệu thời gian thực thay vì Cloud Firestore không? (Đôi khi điều đó xảy ra) Ngoài ra, điều gì sẽ xảy ra nếu bạn không thực hiện truy vấn này và chỉ cố gắng tìm nạp một tài liệu riêng lẻ? –