web-dev-qa-db-ja.com

関数が見つかりませんエラー:名前:[get]。消防署のセキュリティルールシミュレーション

match /UserProfile {
    match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }

上記のセキュリティルールを使用してUserProfile/{uId}からデータを取得しようとすると、ファイアストアに次のエラーがスローされ、コードに不十分な権限が示されます。

Error running simulation — Error: simulator.rules line [199], column [28]. Function not found error: Name: [get].

上記の2つの関数の定義はここにあります

function isUserLoggedIn(){
    return request.auth != null;
}

function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}

最初の関数は非常にうまく動作しますが、2番目の関数は動作しません

そのエラーをスローします

私の知る限り、機能は大丈夫です

私がこのひどい問題で多くの時間を無駄にしているのを手伝ってください

私が試したこと

  1. スレッドの1つで、それは一時的な問題であると読みましたが、そうではありません。 48時間以上経ちました
  2. どこかで、これはシミュレーターのみのバグであると言われましたが、コードはスムーズに実行され、これでもそうではありません。コードでは、エラーは私が期待するように不十分な権限です
  3. 私はドキュメントを正しく読んだので、私のコードは他のルールでgetメソッドをテストしましたが、正常に機能しています

それは助けてください

8
example

更新:エラーはルールシミュレータのバグです。以下のDougのコメントを参照してください。

私はあなたのルールを試しました、そしてそれらはシミュレーターで期待通りに働きました。

ルール:

match /UserProfile {
  function isUserLoggedIn(){
    return request.auth != null;
  }

  function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
  }

  match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }
}

シミュレータでクエリをテストします。

get /UserProfile/foo
Authenticated: Yes
Firebase UID: bar

データベース内のUserSettings/fooドキュメントに基づいて、要求は成功または失敗します。

リクエストを拒否します:

/UserSettings/foo    
{
 content: "my content"
 blocked: { bar: true }
}

リクエストを許可します:

/UserSettings/foo    
{
 content: "my content"
 blocked: { otheruser: true }
}

データが存在しないか、期待される形式でない場合、エラーがポップアップする可能性があると思います。

たとえば、/UserSettings/fooドキュメントを削除すると、次のようになります。

Error: simulator.rules line [58], column [28]. Function not found error: Name: [get].

blockedフィールドがマップ以外の場合にもこのエラーが発生します(inはマップの関数であるため)。

Error: simulator.rules line [58], column [95]. Function not found error: Name: [in].

existsを使用してblockedのタイプを確認することで、これらのエラーをクリーンアップできる可能性がありますが、いずれにしても、ルールは期待どおりにリクエストを拒否する必要があります。

6
Juan Lara