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