2017-10-10 20 views
7

Tôi hiện đang cố gắng xây dựng ứng dụng nhỏ trên firebase như một đánh giá về nó. Có vẻ thú vị và siêu năng suất, nhưng tôi có một vấn đề với các quy tắc về vệ sinh.Quy tắc đọc Firestore với điều kiện tự

Tôi có một bộ sưu tập (trò chơi) với các đối tượng tìm kiếm như thế này:

{ 
    "name":String, 
    "description":String, 
    "owners": 
    { 
     "uid": String 
     "uid2": String 
    } 
} 

Và quy tắc thiết lập như thế này:

service cloud.firestore { 
    match /databases/{database}/documents { 
     match /games { 
      match /{game} { 
       allow write: if request.auth != null && request.resource.data.owners[request.auth.uid] == 'ADMIN'; 
       allow update: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN'; 
       allow read: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN'; 
      } 
     } 
    } 
} 

Trong khi ghi, cập nhật công việc tốt. Đọc chỉ hoạt động cho các tài liệu đơn lẻ. Khi tôi cố gắng đọc bộ sưu tập, tôi nhận được lỗi truy cập như thể người dùng không có quyền. Phần làm cho nó không hoạt động là

resource.data.owners[request.auth.uid] == 'ADMIN'. 

Thêm truy vấn thu thập cũng không giúp ích gì.

Tôi đang làm gì sai ở đây? Có cách tiếp cận được đề xuất trong fireestore firebase cho kịch bản tương tự?

EDIT: Tôi đã thử thêm 'get' và 'danh sách' quy tắc như thế này:

allow list: if request.auth != null;

allow get: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';

Nó không làm việc như mong đợi. Tôi mong đợi nó cho phép tôi liệt kê tài liệu với where nhưng nếu có một tài liệu mà tôi không thể get tôi dự kiến ​​sẽ nhận được "Thiếu hoặc không đủ quyền." Những gì tôi có thể làm là liệt kê TẤT CẢ tài liệu nhưng không đọc một số tài liệu trực tiếp (get quy tắc hoạt động khi cố gắng tìm nạp tài liệu đơn lẻ nhưng không phải khi liệt kê chúng từ bộ sưu tập).

CHỈNH SỬA 2: Dường như theo @MikeMcDonald kỳ vọng của tôi là chính xác, nhưng hiện tại nó đang bị lỗi. Đang chờ sửa chữa.

EDIT 3: Bây giờ nó đang làm việc tốt với các quy tắc để có được và danh sách thiết lập theo cách này:

allow get, list: if request.auth != null && resource.data.owners[request.auth.uid] == 'ADMIN';

+1

Lưu ý rằng 'write' là phần mở rộng của' update', do đó quy tắc 'write' hiện tại của bạn sẽ ghi đè' update'. Thay đổi nó thành 'create' và bạn sẽ tiến gần hơn đến mục tiêu dự định của mình. –

+0

@MikeMcDonald cảm ơn, tôi sẽ làm điều đó. Tôi cũng tìm thấy (sau khi đọc gần hơn một chút) rằng có hai "lần đọc". 'get' và' list' sau này tôi sẽ cố gắng cho phép danh sách rộng hơn có thể là thứ mà tôi cần. Cảm ơn! – Monku

+1

'read' là ô chứa' get' và 'list'. Tôi đã xác nhận rằng ở trên là một lỗi - nó sẽ làm việc, nhưng chúng tôi không xử lý các thành viên mảng đúng ở đây. Tôi sẽ theo dõi ở đây khi sửa chữa xong. –

Trả lời

0

Tôi nghĩ rằng tạo và cập nhật hoạt động bởi vì họ là một phần của ghi và điều kiện 1 bao gồm nó.

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