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番目の関数は動作しません
そのエラーをスローします
私の知る限り、機能は大丈夫です
私がこのひどい問題で多くの時間を無駄にしているのを手伝ってください
更新:エラーはルールシミュレータのバグです。以下の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
のタイプを確認することで、これらのエラーをクリーンアップできる可能性がありますが、いずれにしても、ルールは期待どおりにリクエストを拒否する必要があります。