2017-10-10 17 views
9

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?

+0

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

+0

Không, thật không may điều này cũng không hoạt động –

+0

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ẻ? –

Trả lời

9

Chỉnh sửa: Vấn đề này phải được khắc phục ngay bây giờ. Nếu bạn vẫn nhìn thấy nó (và chắc chắn đó là một lỗi với bộ đánh giá quy tắc), hãy cho tôi biết trong phần bình luận.

Tôi đã trò chuyện với một số người ở đây về sự cố bạn đang gặp phải và có vẻ như đó là vấn đề với chính các quy tắc bảo mật. Về cơ bản, vấn đề có vẻ là cụ thể để đánh giá các trường lồng nhau trong các truy vấn, giống như những gì bạn đang làm. Vì vậy, về cơ bản, những gì bạn đang làm sẽ hoạt động tốt và bạn sẽ cần phải chờ cập nhật từ nhóm Firestore để làm cho truy vấn này hoạt động. Tôi sẽ cố gắng nhớ cập nhật câu trả lời này khi điều đó xảy ra. Xin lỗi vì việc đó!

+0

Có bản cập nhật nào về địa điểm này hoặc địa điểm để tự kiểm tra không? Tôi cũng bị chặn bởi vấn đề này và không có cách giải quyết tốt (thiếu cơ cấu lại dữ liệu), chúng tôi vẫn đang treo –

+2

Không có bản cập nhật nào, nhưng tôi biết nhóm đang tích cực làm việc trên đó. –

Các vấn đề liên quan