firestore: PERMISSION_DENIED: ไม่มีสิทธิ์หรือมีสิทธิ์ไม่เพียงพอ


126

ฉันได้รับข้อผิดพลาด

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: ไม่มีสิทธิ์หรือไม่เพียงพอ

สำหรับรหัสด้านล่างในคำสั่ง 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());
             }
         }
     });

ผู้ใช้เข้าสู่ระบบหรือไม่
Suhayl SH

4
คุณได้ตั้งกฎภายใต้แท็บความปลอดภัยใน Firebase Console หรือไม่
Suhayl SH

1
ความผิดพลาดของฉันฉันไม่เห็นดรอปบ็อกซ์สำหรับคลาวด์ firestore ฉันกำลังตรวจสอบในฐานข้อมูลแบบเรียลไทม์เท่านั้น
S Rekhu

ขอบคุณ @SuhaylSH
S Rekhu

คำตอบ:


182

มันใช้ได้กับฉัน

ไปที่ฐานข้อมูล -> กฎ ->

เปลี่ยนallow read, write: if เท็จ จะจริง;

หมายเหตุ: สิ่งนี้จะปิดการรักษาความปลอดภัยของฐานข้อมูลโดยสิ้นเชิง!

ทำให้โลกเขียนได้โดยไม่ต้องพิสูจน์ตัวตน !!! นี่ไม่ใช่วิธีแก้ปัญหาที่จะแนะนำสำหรับสภาพแวดล้อมการผลิต ใช้เพื่อวัตถุประสงค์ในการทดสอบเท่านั้น


44
โปรดทราบว่าช่วยให้ทุกคนสามารถอ่านเขียนฐานข้อมูลของคุณได้โดยไม่ต้องมีการอนุญาตใด ๆ
Sai Gopi Me

110
นี่เป็นวิธีแก้ปัญหาที่น่ากลัวเพียงแค่ปิดใช้งานความปลอดภัย ไปอ่านสิ่งนี้แทนfirebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu เพราะสิ่งนี้ใช้ได้กับทุกคน
Luvnish Monga

11
เช่นเดียวกับที่ @DuncanLuk กล่าวว่ามันเป็นทางออกที่แย่มาก ฉันจะไม่เรียกมันว่าวิธีแก้ปัญหาด้วย
ซ้ำ

6
ทางออกที่ดีที่สุดในการเริ่มต้นอย่างรวดเร็ว ข้อกังวลด้านความปลอดภัยสามารถแก้ไขได้ในภายหลัง
Viacheslav Dobromyslov

79

ไปที่ฐานข้อมูล -> กฎ :

จากนั้นเปลี่ยนกฎด้านล่าง

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

ด้านล่าง

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

9
นี่เป็นความคิดที่ไม่ดีซึ่งทำให้เอกสารทั้งหมดสามารถเขียนได้โดยผู้ใช้ที่ได้รับการรับรองความถูกต้องแม้กระทั่งสิ่งที่เป็นของผู้ใช้รายอื่นสิ่งที่ผู้ดูแลระบบควรเขียนได้หรือไม่สามารถเขียนได้เลย โปรดเก็บรหัสส่วนแรกไว้เพื่อป้องกันกฎความปลอดภัยที่ไม่ได้ใช้งาน
Noxxys

1
โปรดทราบว่าหากคุณให้ผู้อื่นลงชื่อสมัครใช้ (เช่น Google SSO) พวกเขาจะสามารถเข้าถึงข้อมูลทั้งหมดของคุณโดยอัตโนมัติ
ForrestLyman

2
ฉันต้องการอนุญาตให้ผู้ใช้ที่ได้รับการรับรองความถูกต้องของฉัน (จำนวนน้อย) เข้าถึงเอกสารทั้งหมดได้ดังนั้นสูตรนี้จึงเหมาะสำหรับกรณีของฉัน
AFD

20

ดังนั้นในกรณีของฉันฉันมีกฎ DB ต่อไปนี้:

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
    }
  }
}

อย่างที่คุณเห็นมีuidช่องบนstoryเอกสารเพื่อทำเครื่องหมายเจ้าของ

จากนั้นในรหัสของฉันฉันกำลังค้นหาเรื่องราวทั้งหมด (Flutter):

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

และล้มเหลวเนื่องจากฉันได้เพิ่มเรื่องราวบางอย่างผ่านผู้ใช้รายอื่นแล้ว ในการแก้ไขคุณต้องเพิ่มเงื่อนไขให้กับแบบสอบถาม:

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

รายละเอียดเพิ่มเติมที่นี่: https://firebase.google.com/docs/firestore/security/rules-query

แก้ไข: จากลิงค์

กฎไม่ใช่ตัวกรอง เมื่อเขียนแบบสอบถามเพื่อดึงเอกสารโปรดทราบว่ากฎความปลอดภัยไม่ใช่ตัวกรองการสืบค้นทั้งหมดหรือไม่มีอะไรเลย เพื่อช่วยคุณประหยัดเวลาและทรัพยากร Cloud Firestore จะประเมินการสืบค้นเทียบกับชุดผลลัพธ์ที่เป็นไปได้แทนที่จะเป็นค่าฟิลด์จริงสำหรับเอกสารทั้งหมดของคุณ หากแบบสอบถามอาจส่งคืนเอกสารที่ไคลเอนต์ไม่มีสิทธิ์อ่านคำขอทั้งหมดจะล้มเหลว


วัตถุของผู้ใช้คืออะไร?
ภาณีฤทธิ์วิจิตร

นี่คือคำตอบที่ดีที่สุด
Elia Weiss

13

คำตอบที่ได้รับการโหวตข้างต้นเป็นอันตรายต่อสุขภาพของฐานข้อมูลของคุณ คุณยังสามารถทำให้ฐานข้อมูลของคุณพร้อมใช้งานสำหรับการอ่านเท่านั้นไม่ใช่เพื่อการเขียน:

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

1
วิธีใดเป็นวิธีที่ถูกต้องในการเปิดใช้งานสิทธิ์ แต่ไม่ใช่สำหรับทุกคน
nyxee

8

หากคุณลองใช้ Java Swing Application

  1. ไปที่Firebase Console> Project Overview>Project Settings

  2. จากนั้นไปที่แท็บบัญชีบริการจากนั้นคลิกที่สร้างคีย์ส่วนตัวใหม่

  3. คุณจะได้รับไฟล์. json วางไว้ในเส้นทางที่รู้จัก

  4. จากนั้นไปที่คุณสมบัติคอมพิวเตอร์ของฉันการตั้งค่าระบบขั้นสูงตัวแปรสภาพแวดล้อม

  5. สร้างGOOGLE_APPLICATION_CREDENTIALSค่าตัวแปรเส้นทางใหม่ด้วยพา ธ ของคุณไปยังไฟล์ json


นี่เป็นปัญหาของฉันเกินไปมีข้อมูลสำหรับการนี้ในเอกสาร
tris timb

5

npm i - บันทึก firebase @ angular / fire

ใน app.module ตรวจสอบให้แน่ใจว่าคุณได้นำเข้า

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

ในการนำเข้า

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

ในกฎฐานข้อมูลแบบเรียลไทม์ให้แน่ใจว่าคุณมี

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

ในกฎ cloud firestore ให้แน่ใจว่าคุณมี

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

3

ตรวจสอบให้แน่ใจว่า DB ของคุณไม่ว่างเปล่าและแบบสอบถามของคุณมีไว้สำหรับคอลเลกชันที่ไม่มีอยู่


9
ข้อยกเว้นนี้ไม่มีส่วนเกี่ยวข้องกับคอลเล็กชันหรือฐานข้อมูลที่ว่างเปล่า แต่เป็นปัญหาการอนุญาต
Ojonugwa Jude Ochalifu

ข้อยกเว้นนี้ไม่เกี่ยวข้องกับ Db ที่ว่างเปล่าเป็นต้นปัญหาเกี่ยวกับกฎความปลอดภัยและการตรวจสอบสิทธิ์
Rehan Ali

ฉันและอีกอย่างน้อย 3 คนมีข้อยกเว้นในสถานการณ์นี้ หากยังไม่ช่วยคุณให้ไปยังแนวทางแก้ไขปัญหาถัดไป
itzhar

3

นอกจากนี้คุณอาจได้รับข้อผิดพลาดนี้หากการอ้างอิงคอลเล็กชันจากรหัสของคุณไม่ตรงกับชื่อคอลเล็กชันใน firebase

ตัวอย่างเช่นชื่อคอลเล็กชันบน firebase คือusersแต่คุณอ้างถึงด้วยdb.collection("Users")หรือdb.collection("user")

เป็นกรณีที่สำคัญเช่นกัน

หวังว่านี่จะช่วยใครบางคนได้


คอลเลกชันนี้ไม่ได้สร้างขึ้นโดยปริยายหรือ ในตัวอย่างคอลเล็กชัน "ผู้ใช้" และ "ผู้ใช้" ของคุณจะถูกสร้างขึ้นตามและเมื่อมีการอ้างอิง
bdev TJ

สามารถดูข้อมูลได้ที่นี่ codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ

@DevTJ คุณถูกต้องเมื่อเป็นaddหรือsetร้องขอ แต่จากคำถามมันเป็นการgetร้องขอ ฉันเคยมีประสบการณ์นี้มาก่อน
Anga


2

หากมีคนมาที่นี่เพื่อพยายามเข้าถึง Firestore ด้วยบัญชีบริการ:

ฉันแก้ไขปัญหานี้โดยให้Service Account UserบทบาทบัญชีบริการนอกเหนือจากCloud Datastore Userบทบาทในการตั้งค่า IAM ของ GCP


2

ในเวลานี้คือเดือนมิถุนายน 2020โดยค่าเริ่มต้น firebase จะกำหนดตามเวลา กำหนดเวลาที่จะตอบสนองความต้องการของคุณ

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

โปรดทราบ:ฐานข้อมูลของคุณยังคงเปิดให้ทุกคน ฉันขอแนะนำโปรดอ่านเอกสารและกำหนดค่าฐานข้อมูลในแบบที่เป็นประโยชน์สำหรับคุณ


1

ปัญหาคือคุณพยายามอ่านหรือเขียนข้อมูลไปยังฐานข้อมูลเรียลไทม์หรือ firestore ก่อนที่ผู้ใช้จะได้รับการพิสูจน์ตัวตน โปรดลองตรวจสอบขอบเขตของรหัสของคุณ หวังว่ามันจะช่วยได้!



1

สำหรับฉันมันเป็นปัญหาเกี่ยวกับวันที่ อัปเดตและปัญหาได้รับการแก้ไขแล้ว

อนุญาตให้อ่าน / เขียน:

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

แก้ไข: หากคุณยังสับสนและไม่สามารถเข้าใจได้ว่าเกิดปัญหาอะไรเพียงแค่ดูที่ส่วนกฎในคอนโซล Firebase ของคุณ


1

เวลาที่กำหนดอาจสิ้นสุดลง

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);
    }
  }
}

นั่นเอง วันนี้การเปลี่ยนแปลง ในบรรทัดนี้:

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

0

ไปที่กฎใน firebase และแก้ไขกฎ ..... (ระบุการประทับเวลาหรือตั้งค่าเป็นเท็จ) วิธีแก้ปัญหาของฉัน

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2021, 8, 18);
    }
  }
}


-1

กฎของคุณควรเป็นเช่นนี้สำหรับกรณีนี้ แต่ข้อความบอกว่าไม่ใช่วิธีที่แนะนำ แต่ถ้าคุณทำเช่นนี้คุณสามารถแทรกได้โดยไม่มีข้อผิดพลาดในการอนุญาต

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.