Firebase数据库规则UID访问权限

3
我有以下基本的安全规则(任何人都可以在公共数据库中读取帖子,并且可以将自己的信息读/写入其帐户)。
我想放置一个数据库规则,该规则将允许特定的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":{ 下面,它应该可以工作。如果不行,请您展示完整的规则和相关代码,以便我们找出问题所在。 - Frank van Puffelen
谢谢确认我的代码是正确的。我再次尝试了一下,现在它运行得很好。(我猜我在某个地方打错了一些东西。) - user1508405
2个回答

0

我再次尝试了我的解决方案,它运行良好。

这里只是一个规则参考,供任何想要做我所做的事情的人使用。(这只提供读取访问权限,但您可以添加另一行以获取写入权限。)

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

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


0
根据文档,推荐的方法是这样的:
{
  "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对象。在此自定义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);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接