2016-08-09 69 views
0

Dies ist Datenbankstruktur.Firebase-Regeln, die dem Benutzer das Schreiben von Daten in Android nicht erlauben

enter image description here

Dies sind Datenbank Regeln:

{ 
    "rules": { 
    ".read": true, 
    "shops-product-list": { 
     "$uid": { 

     // grants write access to the owner of this user account whose uid must exactly match the key ($uid) 
     ".write": "auth !== null && auth.uid === $uid", 
     } 
    } 
    } 
} 

Schlüssel für Geschäfte Produkte-Liste angemeldet ist in uid des Benutzers (ignorierten ersten Schlüssel dh -1)

Angemeldeten Benutzer zu versuchen, schreibe neue Daten mit dieser Logik.

private void addShopVariant(String pid, String vid, String mrp, String sellPrice) { 
    // Create new post at /user-posts/$userid/$postid and at 
    // /posts/$postid simultaneously 

    final String uid = getUid(); 
    String key = pid + "_" + vid; 
    //String key = databaseReference.child("shops-product-list").child(uid).push().getKey(); 

    ShopProductVariant shopProductVariant = new ShopProductVariant(pid, vid, mrp, sellPrice); 
    Map<String, Object> shopProductVariantValues = shopProductVariant.toMap(); 
    Map<String, Object> childUpdates = new HashMap<>(); 
    childUpdates.put("/shops-product-list/" + uid + "/"+ key, shopProductVariantValues); 
    //childUpdates.put("/user-posts/" + userId + "/" + key, postValues); 

    databaseReference.updateChildren(childUpdates); 
} 

Funktion funktioniert gut, wenn ich Regeln festlege.

Aber ich möchte nur eingeloggte Benutzer sollten in der Lage sein zu schreiben, dass auch nur ihre eigenen Daten.

was ist falsch ist über Firebase-Regeln?

+0

Aus einem schnellen Blick sieht es aus wie die Regeln funktionieren sollten. Können Sie den Code weiter reduzieren, um nur konstante Werte zu verwenden? Zum Beispiel: Was bringt 'getUid() 'zurück? Ist das wirklich der angemeldete Benutzer? Beachten Sie auch, dass 'updateChildren()' einen Completion-Listener verwendet, der Ihnen mehr darüber verrät, warum der Vorgang fehlgeschlagen ist. –

Antwort

0

Ich glaube, Sie Regeln sind falsch Setup:

Es sollte wie folgt gestaltet sein:

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

Beachten Sie die Syntax es ist = nicht ==

Edit:! Statt Validieren Dies auf dem Server können Sie tun:

scoresRef.child("the user id").setValue("your value", withCompletionBlock: { (error:NSError?, snapshot:FIRDatabaseReference) in 


}) 

so, dass Sie don ' t muss es in den Regeln tun

+0

Ich denke es ist nur! ==. Bitte überprüfen Sie diesen offiziellen Dokumentationslink. https://www.firebase.com/docs/security/guide/user-security.html –

+0

Ich verwende tatsächlich diese Syntax, um meine Regeln zu konfigurieren. – Jad

+0

Wirklich das === es funktioniert aber nicht! == – Jad