firestore: PERMISSION_DENIED: Thiếu hoặc không đủ quyền


117

Tôi đang gặp lỗi

getdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Thiếu hoặc không đủ quyền.

cho đoạn mã dưới đây trên câu lệnh else

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 for (DocumentSnapshot document : task.getResult()) {
                     s(document.getId() + " => " + document.getData());
                 }
             } else {
                 s("Error getting documents."+ task.getException());
             }
         }
     });

Người dùng đã đăng nhập chưa?
Suhayl SH

4
Bạn đã đặt quy tắc trong Tab bảo mật trong Bảng điều khiển Firebase chưa?
Suhayl SH

1
Lỗi của tôi, tôi không nhìn thấy hộp thả cho cửa hàng lửa trên đám mây. Tôi chỉ kiểm tra trong cơ sở dữ liệu thời gian thực.
S Rekhu

cảm ơn @SuhaylSH
S Rekhu

Câu trả lời:


171

Nó chỉ đơn giản là làm việc cho tôi.

Vào Cơ sở dữ liệu -> Quy tắc ->

Thay đổi allow read, write: if sai; thành sự thật;

Lưu ý: Điều này hoàn toàn tắt bảo mật cho cơ sở dữ liệu!

Làm cho thế giới có thể ghi mà không cần xác thực !!! Đây KHÔNG phải là giải pháp được khuyến nghị cho môi trường sản xuất. Chỉ sử dụng cái này cho mục đích thử nghiệm.


43
lưu ý rằng nó cho phép mọi người đọc, ghi cơ sở dữ liệu của bạn mà không cần bất kỳ ủy quyền nào.
Sai Gopi Me

103
Đây là một giải pháp khủng khiếp, điều này thực sự chỉ vô hiệu hóa bảo mật. Go đọc thay vì: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu vì đây đang làm việc cho tất cả mọi người
Luvnish Monga

11
Giống như @DuncanLuk đã nói, đó là một giải pháp khủng khiếp. Tôi thậm chí sẽ không gọi nó là một giải pháp
Ojonugwa Jude Ochalifu

6
Giải pháp tốt nhất để bắt đầu thực sự nhanh chóng. Những lo ngại về bảo mật thực sự có thể được khắc phục sau đó.
Viacheslav Dobromyslov

79

Đi đến Cơ sở dữ liệu -> Quy tắc :

Sau đó đã thay đổi các quy tắc dưới đây

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

xuống dưới

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

9
Đây là một ý tưởng tồi, điều này làm cho TẤT CẢ tài liệu có thể được ghi bởi BẤT KỲ người dùng đã xác thực nào, ngay cả những thứ thuộc về những người dùng khác, những thứ chỉ được quản trị viên ghi hoặc không bao giờ có thể ghi được. Vui lòng giữ đoạn mã đầu tiên vì nó bảo vệ khỏi các quy tắc bảo mật chưa được thực hiện.
Noxxys

1
Lưu ý rằng nếu bạn cho phép mọi người đăng ký (với Google SSO chẳng hạn), họ sẽ tự động có quyền truy cập vào tất cả dữ liệu của bạn.
ForrestLyman

2
Tôi muốn cho phép người dùng đã xác thực của mình (một số ít) truy cập vào tất cả các tài liệu, vì vậy công thức này là hoàn hảo cho trường hợp của tôi.
AFD

1
Đây phải là câu trả lời được chấp nhận.
Ishaan

19

Vì vậy, trong trường hợp của tôi, tôi có các quy tắc DB sau:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{story} {
      function isSignedIn() {
        return request.auth.uid != null;
      }
    
      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

Như bạn có thể thấy, có một uidtrường trên storytài liệu để đánh dấu chủ sở hữu.

Sau đó, trong mã của tôi, tôi đang truy vấn tất cả các câu chuyện (Flutter):

Firestore.instance
          .collection('stories')
          .snapshots()

Và nó không thành công vì tôi đã thêm một số câu chuyện thông qua những người dùng khác nhau. Để khắc phục, bạn cần thêm điều kiện vào truy vấn:

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

Thêm chi tiết tại đây: https://firebase.google.com/docs/firestore/security/rules-query

CHỈNH SỬA: từ liên kết

Quy tắc không phải là bộ lọc Khi viết truy vấn để truy xuất tài liệu, hãy nhớ rằng quy tắc bảo mật không phải là bộ lọc — truy vấn là tất cả hoặc không có gì. Để giúp bạn tiết kiệm thời gian và tài nguyên, Cloud Firestore đánh giá một truy vấn dựa trên tập hợp kết quả tiềm năng của nó thay vì các giá trị trường thực tế cho tất cả các tài liệu của bạn. Nếu một truy vấn có thể trả về các tài liệu mà máy khách không có quyền đọc, thì toàn bộ yêu cầu sẽ không thành công.


đối tượng người dùng là gì?
Phani Rithvij

Đây là câu trả lời hay nhất
Elia Weiss

12

Các câu trả lời được bình chọn ở trên nguy hiểm cho sức khỏe của cơ sở dữ liệu của bạn. Bạn vẫn có thể cung cấp cơ sở dữ liệu của mình chỉ để đọc chứ không phải để ghi:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}

1
Cách chính xác để bật quyền, nhưng không phải cho tất cả mọi người?
nyxee

8

Nếu bạn thử trong Ứng dụng Java Swing.

  1. Go To Firebase Console> Project Overview>Project Settings

  2. Sau đó, chuyển đến tab tài khoản dịch vụ và sau đó nhấp vào tạo khóa cá nhân mới.

  3. Bạn sẽ nhận được một tệp .json, hãy đặt nó vào một đường dẫn đã biết

  4. Sau đó đi tới Thuộc tính máy tính của tôi, Cài đặt hệ thống nâng cao, Biến môi trường.

  5. Tạo GOOGLE_APPLICATION_CREDENTIALSgiá trị biến đường dẫn mới với đường dẫn của bạn đến tệp json.


Đây cũng là vấn đề của tôi, có thông tin về điều này trên tài liệu .
tris timb

5

npm i --save firebase @ angle / fire

trong app.module, hãy đảm bảo rằng bạn đã nhập

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';

nhập khẩu

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

trong quy tắc cơ sở dữ liệu thời gian thực, hãy đảm bảo rằng bạn có

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

trong quy tắc cửa hàng lửa trên đám mây, hãy đảm bảo rằng bạn có

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

3

đảm bảo rằng DB của bạn không trống hoặc truy vấn của bạn dành cho bộ sưu tập không tồn tại


8
Ngoại lệ này không có gì để làm với bộ sưu tập hoặc db trống rỗng, đó là một vấn đề cho phép
Ojonugwa Jude Ochalifu

Ngoại lệ này không liên quan gì đến Db trống, v.v. Vấn đề với các quy tắc bảo mật và Auth.
Rehan Ali

Tôi và ít nhất 3 người khác có ngoại lệ này trong trường hợp này. Nếu nó không giúp được bạn, hãy chuyển sang giải pháp tiếp theo
itzhar Ngày

3

Ngoài ra, bạn có thể gặp lỗi này nếu tham chiếu thu thập từ mã của bạn không khớp với tên tập hợp trên firebase.

Ví dụ: tên bộ sưu tập trên firebase là users, nhưng bạn tham chiếu nó vớidb.collection("Users") hoặcdb.collection("user")

Nó cũng phân biệt chữ hoa chữ thường.

Hy vọng điều này sẽ giúp ai đó


Không phải bộ sưu tập được tạo ra một cách ngầm? Trong ví dụ của bạn, bộ sưu tập "Người dùng" và "người dùng" sẽ được tạo khi và khi nó được tham chiếu.
bdev TJ

Thông tin có thể được tìm thấy tại đây. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ

@DevTJ bạn đúng khi đó là một addhoặc setyêu cầu, nhưng từ câu hỏi thì đó là một getyêu cầu. Tôi đã từng trải nghiệm điều này trước đây
Anga


2

Nếu ai đó đến đây cố gắng truy cập Firestore bằng tài khoản dịch vụ:

Tôi đã giải quyết vấn đề này bằng cách cấp cho tài khoản dịch vụ Service Account Uservai trò ngoài Cloud Datastore Uservai trò trong cài đặt IAM của GCP.


2

Tại thời điểm này, tháng 6 năm 2020, theo mặc định, firebase được xác định theo thời gian. Xác định thời gian để đáp ứng nhu cầu của bạn.

allow read, write: if request.time < timestamp.date(2020, 7, 10);

Xin lưu ý: DB của bạn vẫn mở cho bất kỳ ai. Tôi đề nghị, vui lòng đọc tài liệu và định cấu hình DB theo cách hữu ích cho bạn.


1

vấn đề là bạn đã cố gắng đọc hoặc ghi dữ liệu vào cơ sở dữ liệu thời gian thực hoặc cửa hàng cứu hỏa trước khi người dùng được xác thực. vui lòng thử kiểm tra phạm vi mã của bạn. hy vọng nó đã giúp!



1

Đối với tôi, đó là vấn đề với ngày tháng. Đã cập nhật nó và sự cố đã được giải quyết.

Cho phép đọc / ghi:

 if request.time < timestamp.date(2020, 5, 21);

Chỉnh sửa: Nếu bạn vẫn còn bối rối và không thể tìm ra vấn đề là gì, hãy xem phần quy tắc trong bảng điều khiển firebase của bạn.


1

thời hạn có thể hết

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020,7, 1);
    }
  }
}

ngày thay đổi cho ngày hôm nay trong dòng này:

 allow read, write: if request.time < timestamp.date(2020,7, 1);


-1

Các quy tắc của bạn phải như thế này cho trường hợp này tuy nhiên thông báo cho biết rằng đó không phải là cách được đề xuất, nhưng nếu bạn làm điều này, bạn có thể thực hiện chèn mà không bị lỗi quyền

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.