2017-01-23 67 views
2

我在下面有以下基本安全規則(任何人都可以閱讀公共數據庫中的帖子,並且可以將自己的信息讀取/寫入他們的帳戶)。Firebase數據庫規則UID全部訪問

我希望把數據庫規則,將允許特定的UID(例如:cvFcflWuO3XCU8OtRoEkW9p2cXw1)讀/users/下的所有信息/寫訪問,對於特定UID通配符規則,允許/users/

下獲得的所有子目錄
{ 
    "rules": { 
    "public": 
    { 
    ".read": true, 
    ".write": false 

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

做一個簡單的編輯就像下面的例子不起作用。

".write": "'cvFcflWuO3XCU8OtRoEkW9p2cXw1' === auth.uid", 
+3

如果你將該規則直接放在''users「下面:{'它應該工作。如果沒有,你能否顯示完整的規則和伴隨的代碼不能一起工作? –

+0

感謝您確認我的代碼是正確的。我再次嘗試,現在它工作正常。 (我想我在某處錯誤地輸入了一些東西。) – user1508405

回答

0

我再次嘗試我的解決方案,它工作正常。

這裏只是一個規則參考,任何想要做我所做的事情的人。 (此只給出了讀訪問,但你可以另起一行寫。)

{ 
 
    "rules": { 
 
    "public": 
 
    { 
 
    ".read": true, 
 
    ".write": false 
 

 
    }, 
 
\t "users": { 
 
    ".read": "'cvFcflWuO3XCU8OtRoEkW9p2cXw1' === auth.uid", 
 
    "$uid": 
 
    { 
 
     ".read": "$uid === auth.uid", 
 
     ".write": "$uid === auth.uid" 
 
     } 
 
    } 
 
    } 
 
}

0

按照該documentation,推薦的方法是這樣的:

{ 
    "rules": { 
    "public_resource": { 
     ".read": true, 
     ".write": true 
    }, 
    "some_resource": { 
     ".read": "auth.uid === 'my-service-worker'", 
     ".write": false 
    }, 
    "another_resource": { 
     ".read": "auth.uid === 'my-service-worker'", 
     ".write": "auth.uid === 'my-service-worker'" 
    } 
    } 
} 

然後,在您的服務器上,初始化FirebaseApp對象時,使用databaseAuthVariableOverride參數來覆蓋數據庫規則使用的auth對象。在此自定義身份驗證對象中,將uid字段設置爲您在安全規則中用於表示服務的標識符。

// Fetch the service account key JSON file contents 
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountCredentials.json"); 

// Initialize the app with a custom auth variable, limiting the server's access 
Map<String, Object> auth = new HashMap<String, Object>(); 
auth.put("uid", "my-service-worker"); 

FirebaseOptions options = new FirebaseOptions.Builder() 
    .setCredential(FirebaseCredentials.fromCertificate(serviceAccount)) 
    .setDatabaseUrl("https://databaseName.firebaseio.com") 
    .setDatabaseAuthVariableOverride(auth) 
    .build(); 
FirebaseApp.initializeApp(options); 

// The app only has access as defined in the Security Rules 
DatabaseReference ref = FirebaseDatabase 
    .getInstance() 
    .getReference("/some_resource"); 
ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String res = dataSnapshot.getValue(); 
     System.out.println(res); 
    } 
});