0
votes

I'm developing one small demo project which uses Firebase Auth and Database. I have the following rule configured for my firebase database

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }

Through this rule, I want an authenticated user to have a read and write access for their data only.

Below is the java code which is trying to save data.

DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference().child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("basic");
{
DemoModel demoModel=new DemoModel();
demoModel.setId(databaseReference.push().getKey());  
demoModel.setUser("demoUser");        databaseReference.child(demoModel.getId()).setValue(demoModel).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful()){
                            Toast.makeText(DemoActivity.this, Constants.SUCCESSFUL, Toast.LENGTH_SHORT).show();
                        }else {
                            Toast.makeText(DemoActivity.this, Constants.FAILED, Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }

Error I'm getting: W/RepoOperation: setValue at /xgjCUqcasda444WkgZFHTNRUB3/basic/-Lywe44rft566hhyYYfDS failed: DatabaseError: Permission denied W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.

My database looks like:

demoProject-dd4568
    xgjCUqcasda444WkgZFHTNRUB3
        -basic
            -LE3gdfdffdfaza
                id:"-LE3gdfdffdfaza"
                user: "asdasd"

Where I'm going wrong. I don't have much clue. when I change the rule to

{
  "rules": {
        ".read":"auth != null",
        ".write":"auth != null"
}
}

it works fine. but it's not secure then.

1

1 Answers

0
votes

Your rules don't match your database structure at all. Your rules are protecting child nodes under users, but you don't have a users node in your database.

You should probably be changing the location of the write to include users in the path.

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference root = FirebaseDatabase.getInstance().getReference(); 
//providing uid
DatabaseReference ref = root.child("users").child(uid).child("basic");