在Firebase中定义用户角色

时间:2016-08-30 20:02:39

标签: android firebase firebase-realtime-database

在我的Android应用中, Firebase作为后端 ,我计划根据安全性拥有三个角色。 UserEditorAdministrator

默认情况下,任何使用Facebook注册的人都会被授予用户角色。

  • 用户可以阅读任何内容但写入权限非常有限(provide reviews)。
  • 编辑器可以读取任何内容,并且具有比用户(create articles, provide reviews)更多的写入权限。
  • 管理员可以create/Delete Editors

管理员可以将用户角色升级为编辑器,反之亦然。 因此,需要创建用户角色和编辑器角色。 但是,如何首先创建管理员?

此致

2 个答案:

答案 0 :(得分:0)

这取决于是什么让某人成为管理员。如果您想预先明确管理管理员列表,只需在Firebase控制台中查找它们,然后将uid复制到您的安全规则中。

".write": "auth.uid == 'theUidThatYouLookedUp"

或者更好的一个方面是在数据库中保留一个只读管理员列表并参考规则中的那个:

".write": "root.child('admins').child(auth.uid).exists()"

但是应用程序中经常会有一些东西确定某人是否是管理员。例如:聊天室的创建者是其管理员。在这种情况下,您可以在创建聊天室时存储该聊天室的管理员。

"chatRooms": {
  "$chatRoomId": {
    ".write": "root.child('chatRoomOwners').child($chatRoomId).val() == auth.uid"
  }
}

答案 1 :(得分:0)

Firebase刚刚通过ID令牌上的自定义用户声明启动了对任何用户基于角色的访问的支持:https://firebase.google.com/docs/auth/admin/custom-claims

您将定义管理员访问规则:

{
  "rules": {
    "adminContent": {
      ".read": "auth.token.role === 'admin'",
      ".write": "auth.token.role === 'admin'",
    }
  }
}

使用Admin SDK设置用户角色:

// Set admin privilege on the user corresponding to uid.
admin.auth().setCustomUserClaims(uid, {role: 'admin'}).then(() => {
  // The new custom claims will propagate to the user's ID token the
  // next time a new one is issued.
});

这将传播到相应用户的ID令牌声明。

要从客户端上的令牌解析它,您需要对ID令牌的有效负载进行base64解码。

您可以根据需要升级/降级用户。设置编辑器角色遵循相同的概念。