firestore : PERMISSION_DENIED : 권한이 없거나 부족합니다.


119

오류가 발생합니다

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 콘솔의 보안 탭에서 규칙을 설정 했습니까?
Suhayl SH

1
내 실수로 클라우드 Firestore의 드롭 박스를 보지 못했습니다. 나는 실시간 데이터베이스에서만 확인하고 있었다.
S Rekhu

감사 @SuhaylSH
S Rekhu

답변:


174

그것은 단순히 나를 위해 작동합니다.

데이터베이스-> 규칙->으로 이동하십시오.

allow read, write: if 거짓으로 변경하십시오 . 진정한;

참고 : 이것은 데이터베이스의 보안을 완전히 해제합니다!

인증없이 쓸 수있는 세상 만들기 !!! 이것은 프로덕션 환경에 권장되는 솔루션이 아닙니다. 테스트 목적으로 만 사용하십시오.


44
모든 사람이 권한없이 데이터베이스를 읽고 쓸 수 있습니다.
사이 Gopi 나

104
이것은 끔찍한 솔루션이며 문자 그대로 보안을 비활성화합니다. 대신 읽어 보세요
Duncan Luk

2
@ojonugwaochalifu이 있기 때문에 모두를위한 노력
Luvnish하기 Monga

11
@DuncanLuk가 말했듯이 끔찍한 솔루션입니다. 난 그것을 솔루션을 호출하지 것이다
Ojonugwa 유 Ochalifu

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

1
이것은 받아 들여진 대답이어야합니다.
Ishaan

19

그래서 제 경우에는 다음과 같은 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는 모든 문서의 실제 필드 값 대신 잠재적 인 결과 집합에 대해 쿼리를 평가합니다. 쿼리가 클라이언트에 읽기 권한이없는 문서를 잠재적으로 반환 할 수있는 경우 전체 요청이 실패합니다.


사용자 개체는 무엇입니까?
Phani Rithvij

이것이 최고의 답변입니다
Elia Weiss

12

위의 투표 된 답변은 데이터베이스 상태에 위험합니다. 여전히 데이터베이스를 쓰기 용이 아닌 읽기 용으로 사용할 수 있습니다.

  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_CREDENTIALSjson 파일의 경로로 새 경로 변수 값을 만듭니다 .


이것도 내 문제였으며 문서 에 이에 대한 정보가 있습니다.
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가 비어 있지 않은지 또는 존재하지 않는 컬렉션에 대한 쿼리인지 확인하십시오.


8
이 예외가 비어 수집 또는 DB를 함께 할 수 없다, 그것은 권한 문제입니다
Ojonugwa 유 Ochalifu

이 예외는 빈 Db 등과 관련이 없습니다. 보안 규칙 및 인증에 문제가 있습니다.
Rehan Ali

나와 최소 3 명은이 시나리오에서 예외가 있습니다. 도움이되지 않으면 다음 해결 방법으로 이동하십시오
itzhar

3

또한 코드의 컬렉션 참조가 firebase의 컬렉션 이름과 일치하지 않으면이 오류가 발생할 수 있습니다.

예를 들어 firebase의 컬렉션 이름은 users이지만 db.collection("Users")또는db.collection("user")

대소 문자도 구분합니다.

이것이 누군가에게 도움이되기를 바랍니다.


컬렉션이 암시 적으로 생성되지 않습니까? 예제에서 "Users"및 "user"컬렉션은 참조 될 때 생성됩니다.
bdev TJ

정보는 여기에서 찾을 수 있습니다. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ

@DevTJ는 add또는 set요청 일 때 정확 하지만 질문에서는 get요청입니다. 나는 전에 이것을 경험했습니다
Anga


2

누군가 서비스 계정으로 Firestore에 액세스하려고 여기에 도착한 경우 :

GCP의 IAM 설정에 Service Account User있는 Cloud Datastore User역할 외에도 서비스 계정에 역할 을 부여하여이 문제를 해결했습니다 .


2

현재 2020 년 6 월, 기본적으로 firebase는 시간으로 정의됩니다. 요구 사항을 충족 할 시간을 정의하십시오.

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

참고 : DB는 여전히 누구에게나 열려 있습니다. 설명서를 읽고 유용한 방식으로 DB를 구성하십시오.


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


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