【问题标题】:How to separate user roles in firebase?如何在firebase中分离用户角色?
【发布时间】:2016-12-04 15:04:24
【问题描述】:

如何在 firebase android 应用中添加用户角色身份验证?据我所知,firebase 只有电子邮件和密码身份验证。我想开发一个具有 2 个以上用户角色的 android 应用程序。例如,如果普通会员登录,他会去 normal_memberActivity,如果他是高级会员,他会去 premium_memberActivity。如何在 Firebase 中添加角色?找不到和我类似的问题。

通常,我会这样做:

String role = intent.getStringExtra("role");

if (role.equals("admin")){
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content_frame, new AdminHomeFragment()).commit();
}else{
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content_frame, new NormalFragment()).commit();
}

【问题讨论】:

  • 您应该将用户保存在实时数据库中。这样,您可以使用角色属性创建自定义用户。所以每次用户登录时,你都可以查看他在数据库中的角色。
  • @RosárioPereiraFernandes 与 Auth 有什么不同?如果我要为我的用户使用实时数据库,它是否也可以用于朋友系统?
  • 是的,这是创建好友系统的最佳方式。我希望你熟悉数据库。如果您使用过 SQL 数据库,这对您来说可能看起来有点不同(因为 firebase 使用 NoSQL JSON 数据库),但您会习惯的。

标签: android firebase firebase-authentication


【解决方案1】:

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

您将定义高级访问规则:

{
  "rules": {
    "premiumContent": {
      ".read": "auth.token.role === 'premium'",
      ".write": "auth.token.role === 'premium'",
    }
  }
}

使用 Admin SDK 设置用户角色:

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

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

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

您可以根据需要升级/降级用户。如果您有重复的脚本来更改用户的访问级别,他们还提供了一种列出所有用户的编程方式:https://firebase.google.com/docs/auth/admin/manage-users#list_all_users

【讨论】:

    【解决方案2】:

    您可以在存储用户 uid 及其角色的 firebase 数据库中添加角色节点。

    "roles" : {
        "uid1" : "normal",
        "uid2" : "premium",
        "uid3" : "normal",
    }
    

    那么就可以在用户登录成功后获取角色值

    ref.child("roles").child(firebaseUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String role = dataSnapshot.getValue(String.class);
            // check role and replace fragment
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
    

    【讨论】:

    • 以后试试! :) 顺便问一下,你能给我一个关于注册普通用户和高级用户的sn-p吗?完全不知道。谢谢!
    • @Gian7 关注this guide,您可以将值设置为addOnCompleteListener下的那个“角色”节点
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2021-07-09
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2019-10-06
    相关资源
    最近更新 更多