web-dev-qa-db-ja.com

Firestoreセキュリティルールget()が機能しない

解決策は投稿の最後にあります。見てみな。

Решениепроблемывконцепоста。 Дочитайте。

単純な質問:これの何が問題で、なぜこれが機能しないのですか?

ユーザーセクションで「admin」の役割を持つユーザーに/ titles/{anyTitle}へのアクセスを試みても、

不足または不十分な権限

_service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow write: if false;
      allow read: if false;
    }
    function userCanWrite () {
      return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
    }
    match /titles/{anyTitle=**} {
      allow read: if request.auth != null;
      allow write: if userCanWrite();
    }
  }
}
_

これが私のデータベース構造です

P.S。

公式ドキュメントから別のルールを試しましたget(/databases/{database}/documents/users/$(request.auth.uid‌​)).data.isAdmin == true;

これも機能していません

更新:それを行うための正しい方法

サポートは私が解決策を見つけるのに役立ちました。これはあなたがすべき方法です:

db構造:

ユーザー-> {{userid}}-> {ロール: "admin"}

データベースルール設定:

get(usersPath/$(request.auth.uid))。role == "admin" || get(usersPath/$(request.auth.uid))。data.role == "admin";

12
numfin

私はそのバグを報告するためにFirebaseサポートに連絡し、彼らは私にこれに関する一時的な解決策をくれました。システムのセキュリティルールの側にバグがあるようです。彼らはドキュメントは大丈夫だと言っていますが、今のところはこの方法で回避する必要があります:

get(path).data.field == true || get(path).field == true;

バグはデータオブジェクトが入力されていないことなので、両方のプロパティを確認する必要があります。このバグの解決策をリリースするためのETAはないので、この問題を解決するときにアドバイスを提供してもらえるかどうか尋ねたので、この回答を最新の状態に保ちます。

14
Joan Picornell

だから私がそれを解決した方法は、別のCollectionと呼ばれるadminsを作成したことです

次に、ここで必要なユーザーのuidを追加しました-これが私のデータベース構造です- https://i.imgur.com/RFxrKYT.png

そしてここにルールがあります

service cloud.firestore {
  match /databases/{database}/documents {

    function isAdmin() {
      return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
    }

    match /tasks/{anyTask} {
    allow read: if request.auth != null;
      allow create: if request.auth != null;
      allow update: if request.auth != null && isAdmin();
      allow delete: if request.auth != null && isAdmin();
    }
  }
}

ここで私の完全なオープンソースプロジェクトを表示できます: https://github.com/metaburn/doocrate

4
Gal Bracha

コードでは、_{database}_の代わりに$(database)を使用する必要があります。

_get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
_
2

私にとってうまくいったことは、userCanWrite関数を私のルールの上に移動することでした。関数は、それを呼び出すmatchルールの前に定義する必要があるようです。狂気:-)

1
Derrick Miller

これは、ユーザーが管理者かどうかを確認するために使用するFirestoreルールです。

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


match /{document=**} {
  allow read: if true;
  allow write: if userIsAdmin();
}


function userIsAdmin() {
    return getUserData().userRole == 'Admin';
}

function getUserData() {
    return get(/databases/$(database)/documents/User/$(request.auth.uid)).data;
}

  }
}
0
TSM