在我的应用程序中,我使用自定义声明为用户分配角色。管理员可以使用时髦的切换按钮(使用云功能)来更改人员的角色,因此他需要查看所有用户的列表...但是,另一方面,当用户注册时,他们需要被添加到用户数据库集合。这个集合显然没有用于授权任何东西,而只是为了使管理员可以更改该集合中用户的角色。因此,管理员需要能够读取表,每个人都必须能够在集合中进行写...。因此,我在这方面的规则如下所示:
{
"rules": {
"users": {
".read": "auth.token.isAdmin === true",
".write": true
},
我已经在redux存储中签入了,它似乎可以工作。我叫动作创建者,当我是普通用户时会在组件中获取用户并访问它,我发现redux存储中的users节点仍然为空...当我以管理员身份登录并转到该组件时,看到用户节点已被填充...似乎可以正常工作,但是我想确保这是一种安全的工作方式,因为让每个人都写到表中的感觉很不妙:-)但是就像我说的那样,表本身不用于授权任何东西,所以也许还可以.....
感谢对此的任何意见:-)
诚挚的问候, 大卫
答案 0 :(得分:0)
您所拥有的是一个相当普遍的模式:每个人都可以编写请求,但是只有授权用户才能读取请求。
只要您确保仅授权用户拥有isAdmin == true
,就不会以这种方式泄漏信息的固有安全风险。
但是现在,任何用户都可以将他们想要的内容写到/users
节点。这也意味着任何用户都可以通过简单的firebase.database().ref("users").remove()
调用删除所有现有数据。那可能是您要防止的东西。
该如何执行取决于用户写给/users
的方式和内容。例如,如果他们在自己的个人资料下编写自己的用户个人资料,并且您使用其UID作为密钥,则可以确保用户只能使用以下方式编写自己的个人资料:
{
"rules": {
"users": {
".read": "auth.token.isAdmin === true",
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
如前所述,这取决于您编写的实际数据,因此,您需要查看securing data access上的Firebase文档并针对您的用例进行实现。
我要考虑的另一件事是限制什么用户可以写入数据库中的该节点。例如,您可以使用.validate
规则来限制他们可以写入的值,甚至可以使用.write
规则来确保用户仅写入自己的数据。