単純な質問:これの何が問題で、なぜこれが機能しないのですか?
ユーザーセクションで「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();
}
}
}
_
公式ドキュメントから別のルールを試しました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";
私はそのバグを報告するためにFirebaseサポートに連絡し、彼らは私にこれに関する一時的な解決策をくれました。システムのセキュリティルールの側にバグがあるようです。彼らはドキュメントは大丈夫だと言っていますが、今のところはこの方法で回避する必要があります:
get(path).data.field == true || get(path).field == true;
バグはデータオブジェクトが入力されていないことなので、両方のプロパティを確認する必要があります。このバグの解決策をリリースするためのETAはないので、この問題を解決するときにアドバイスを提供してもらえるかどうか尋ねたので、この回答を最新の状態に保ちます。
だから私がそれを解決した方法は、別の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
コードでは、_{database}
_の代わりに$(database)
を使用する必要があります。
_get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
_
私にとってうまくいったことは、userCanWrite
関数を私のルールの上に移動することでした。関数は、それを呼び出すmatch
ルールの前に定義する必要があるようです。狂気:-)
これは、ユーザーが管理者かどうかを確認するために使用する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;
}
}
}