如何使自定义声明与存储在Firebase数据库中的角色保持同步

如何使自定义声明与存储在Firebase数据库中的角色保持同步,firebase,firebase-authentication,google-cloud-firestore,firebase-security,Firebase,Firebase Authentication,Google Cloud Firestore,Firebase Security,这个问题是从中提出来的,我觉得这是一个很好的问题,但还没有得到任何答案 如何将auth中的用户链接到数据库中的特定配置文件?(配置文件包含名称、全名、用户类型等) 问题的上下文是指在数据库中存储用户身份验证访问逻辑和/或作为自定义声明的不同策略。如何保持这两个声明的同步()。必须使用admin SDK设置自定义声明,它已经提示可以根据您的逻辑使用云函数来设置声明 如果用户配置文件数据包含用户类型和角色,则可以为用户对象上的更新创建触发器。如果将角色存储为数组,则可以实现如下功能 function

这个问题是从中提出来的,我觉得这是一个很好的问题,但还没有得到任何答案

如何将auth中的用户链接到数据库中的特定配置文件?(配置文件包含名称、全名、用户类型等)


问题的上下文是指在数据库中存储用户身份验证访问逻辑和/或作为自定义声明的不同策略。如何保持这两个声明的同步()。

必须使用admin SDK设置自定义声明,它已经提示可以根据您的逻辑使用云函数来设置声明

如果用户配置文件数据包含用户类型和角色,则可以为用户对象上的更新创建触发器。如果将角色存储为数组,则可以实现如下功能

functions.firestore.document('users/{uid}').onUpdate((change, context) => {
  const uid = context.params.uid;
  const userBefore = change.before.data();
  const userAfter = change.after.data();

  const hasDifferentNumberOfRoles = userBefore.roles.length !== userAfter.roles.length;
  const hasOtherRoles = userBefore.roles.some((role: string) => userAfter.roles.indexOf(role) === -1);

  if (hasDifferentNumberOfRoles || hasOtherRoles) {
    return admin.auth().setCustomUserClaims(uid, { appRoles: userAfter.roles});  
  }

  return null;
});
这可以确保每次数据库中的用户角色发生更改时,您的自定义声明身份也将发生更改

数组对于角色来说很方便,因为使用
array contains
查询Firestore可以很容易地找到具有特定角色的用户,也可以很容易地检查您的应用程序中的角色


关于在自定义声明的
approvles
属性中存储角色的小提示,如果你改变你的结构或者想替换一个用户的所有角色,它很方便地删除所有当前角色。

要考虑自定义声明:1)max size是1000字节2)在下一个令牌刷新之后,更改将反映在客户端/安全规则上,除非你强迫一个。
service cloud.firestore {
  match /databases/{database}/documents {

    match /protected-content/{documentId} {
      allow read: if hasUserRole('admin');
      allow write: if hasUserRole('super-admin');
    }

    function hasUserRole(role) {
      return role in request.auth.token.appRoles;
    }
  }
}