2017-11-11 22 views
3

セキュリティルールを別のオブジェクトへの参照に基づいて作成しようとしています。別のドキュメントへの参照を使用するFirestoreセキュリティルール

私は、ユーザーのコレクションと役割のコレクションを持っています。ユーザーオブジェクトには、ロールコレクション内の特定のドキュメントへの参照である「ロール」というフィールドがあります。

users 
    id 
    name 
    role <-- reference to particular role 

roles 
    id 
    name 
    isSuperUser 

ここでの目標は、特定の役割(isSuperUserと役割== true)を持つユーザーは、他のロールを編集できるようにすることですか、それはサブコレクションです。ここで

私は考えが働いていただろう、私のルールです:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /users/{userId=**} { 
    allow read, write: if request.auth.uid == userId; 
    } 
    match /roles/{roleId=**} { 
     function isSuperUser() { 
     return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role.isSuperuser == true; 
     } 
     allow read: if request.auth.uid != null; 
     allow write: if isSuperUser(); 
    } 
} 

は、私は、次の作品を確認しているが、それは本当に便利ではありません...

get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role != null; 

がある場合ロールベースのセキュリティを実現するためのより良い方法は、私はすべての耳です。

デバッグツールが不足しているため、これはかなりイライラします。

+0

私は基本的に同じことを探しています。私はユーザーが所有する「魚」コレクションを持っています。ユーザーIDを格納する代わりに、ユーザーへの参照を格納します。これで、fish.user.idがauth.uidと同じかどうかを確認したいと思います。それは可能ですか?それともuserIdだけを保存すべきですか? –

答えて

0

ワイルドカードをネストされたパスに移動しようとしましたか?

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /users/{userId} { 
     allow read, write: if request.auth.uid == userId; 
     match /{role=**} { 
     allow read: if request.auth.uid != null; 
     allow write: if isSuperUser(); 
     } 
    } 
    } 
} 
関連する問題