2017-11-06 22 views
0

他の人のメールにアクセスしようとしているユーザーに問題があります。私はE/ContactsFragment.java: Finding email failed. DatabaseError: Permission deniedを得ています。また、データベースに入る前に電子メールがチェックされ、入力した電子メールがデータベースのものと同じであることにも注意してください。 基本的に、私がしようとしているのは、user1user2のメールを見つけることです。そこから、私は電子メールで何かをします。Firebaseセキュリティ権限

{ 
    "rules": { 
    "users":{ 
     ".indexOn": ["email"], 
     "$uid":{ 
     ".read": "auth !== null", 
     "email":{ 
      ".write": "auth !== null && $uid === auth.uid", 
      ".validate": "newData.isString()" 
     } 
     } 
    } 
    } 
} 

ここに私のデータ構造です: database structure

はここで電子メールにアクセスしようとしている私のコードです:

final String TAG = "ContactsFragment.java"; 
FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       // some code 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.e(TAG,"Finding email failed. " + databaseError); 
      } 
     }); 

私はそれを解決することができますか?私は何か重要なものを逃しています

+0

'/ users'の下の子ノードへのユーザーの読み取りアクセスを拒否する唯一のものは、そのユーザーが認証されていない場合です(' '.read": "auth!== null" ')ので、データにアクセスする前にユーザーが認証されていることを確認する必要があります。 – Grimthorr

+0

この機能はログインアクティビティの後に実行され、ユーザがログインアクティビティを通して自分自身を認証できたかどうかを確認できました。だから、私はそのユーザーが認証されていないとは思わない – CraftedGaming

+0

さて、それは理にかなっています。 ['FirebaseAuth.getInstance().getCurrentUser()'](https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuth)を実行することで、ユーザーが認証されたことを確認できます。 html#getCurrentUser())は、ユーザが認証されていない場合は 'null'を返し、認証されている場合は' FirebaseUser'インスタンスを返します。 – Grimthorr

答えて

0

現在のところ、ルールは/usersノードの子にのみ読み取りアクセスを許可しますが、/usersノード自体は読み込みアクセスを許可しないため、リストのクエリが拒否されます。

あなたが$uid子の外にあなたの.readルールを移動した場合、それは、ユーザーが/usersリストノードを照会することができます:

{ 
    "rules": { 
    "users":{ 
     ".indexOn": ["email"], 
     ".read": "auth !== null", 
     "$uid":{ 
     "email":{ 
      ".write": "auth !== null && $uid === auth.uid", 
      ".validate": "newData.isString()" 
     } 
     } 
    } 
    } 
} 

クエリは、リストの下にリストノードではなく、子ノードに接続されていますしたがって、リスト自体に.read権限を付与する必要があります。たとえば、クエリが/usersノードに接続されている:

FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email)[...] 

これはrules are applied in an atomic mannerであるため、深いパスで.readルールが浅いパスへのアクセスを許可しません。

関連する問題