无法获取客户端数据以显示[firestore]

时间:2019-03-04 07:04:43

标签: reactjs firebase-authentication firebase-security-rules

我的数据库设置为/ clients,并使用firebase auth处理用户。我想这样做,以便用户只能看到,编辑和删除他们创建的客户端数据。当前的Firestore安全规则为。

[code]service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /clients/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}[/code]

使用此规则,用户可以将新客户端添加到数据库中,但是不会显示网站上的客户端。我有代码设置,以便当用户添加客户端时,它将用户UID附加到“ userId”下的客户端。显示客户端的代码是

[code]<tbody>
                    {clients.map(client => (
                        <tr key={client.id}>
                            <td>{client.firstName} {client.lastName}</td>
                            <td>{client.dateCreated}</td>
                            <td><a href={`tel:${client.phone}`}>{client.phone}</a></td>
                            <td>
                                <Link to={`/client/${client.id}`} className="btn btn-secondary btn-sm">
                                    <i className="fas fa-arrow-circle-right"></i> Details
                                </Link>
                            </td>
                        </tr>
                    ))}
                 </tbody>

[/ code]

我不确定自己在做什么错,是安全规则还是我选择显示数据的方式?

2 个答案:

答案 0 :(得分:0)

据我了解,您有一个客户集合和一个用户集合。用户可以创建客户端,并且只能查看/编辑/删除已创建的客户端,对吗?如果是这样,只需添加一个 createdBy (可以是任何内容)字段,该字段包含创建特定客户端的用户uid,并检查该字段是否等于您从auth对象获得的uid:

service cloud.firestore {
  match /databases/{database}/documents {
    match /clients/{clientId} {
      // only user who created the client can read/update/delete it
      allow read, update, delete: if resource.data.createdBy == request.auth.uid;
      // logged user only can create a client
      allow create: if request.auth.uid != null;
    }
  }
}

通配符{clientId}仅表示“嘿,此规则适用于client / collection下的任何文档”。通过 resource.data 对象,您可以获取存储在文档中的数据。

文档中列出了所有内容:https://firebase.google.com/docs/firestore/security/get-started

答案 1 :(得分:0)

我能够获得结果,但是无法通过安全规则。调整安全规则和数据库变量,以便将用户ID附加到他们添加的数据后,我尝试了@firebaser建议的规则。我能够按照上述规则创建客户端,但是,我无法查看它们,并且在控制台中收到“配置文件侦听器错误:缺少权限或权限不足。FirebaseError:缺少权限或权限不足”。

基于该错误,看来我不得不在项目文件夹的node模块中编辑一个firebase文件。我不想冒险修改这些文件,所以我没有使用安全规则过滤数据,而是更改了客户端数据的显示方式。我在.filter函数之前添加了.map,以便它仅显示链接到用户ID的客户端。虽然我的安全规则仅允许已登录的用户读取和写入数据。 [代码]

<tbody>
            {clients.filter(client => client.userId === firebase.auth().currentUser.uid).map(client => (
                <tr key={client.id}>
                    <td>{client.firstName} {client.lastName}</td>
                    <td>{client.dateCreated}</td>
                    <td><a href={`tel:${client.phone}`}>{client.phone}</a></td>
                    <td>
                        <Link to={`/client/${client.id}`} className="btn btn-secondary btn-sm">
                            <i className="fas fa-arrow-circle-right"></i> Details
                        </Link>
                    </td>
                </tr>
            ))}
         </tbody>

[/ code]

我真的不能告诉任何人这种方法的安全性,但是它可以工作。