我试图弄清楚角色系统如何与 Firebase 配合使用,但我非常困惑,不明白它是如何工作的。
我想我明白,要为用户授予角色,您必须使用 Firebase Admin SDK 或 Firestore 上的安全规则。
但是我不明白其中的区别以及为什么一个比另一个更有效以及它是如何工作的。
例如:
我的送货应用程序只有 2 个角色:送货员和管理员
投递员有一个移动应用程序,可以指示包裹应投递的地址。
管理员可以访问与移动应用程序上的送货人员相同的界面,但可以访问 Web 应用程序来管理送货。他可以添加送货、司机等...
Firebase 身份验证如何工作以及如何正确使用角色分配?
在登录后立即调用“用户”数据库来了解他是管理员还是普通用户是一个好方法吗?
最佳答案
这个问题的答案有点大,所以我无法提供它的代码片段。但我可以指出一个具有“原子”角色系统的示例项目。您可以查看here .
基础知识。您可以将用户的角色保存在数据库(RTDB 或 Firestore)中。如果您需要两个数据库在两者之间同步以拥有单个系统。
要点是,每个用户只能读取自己的角色,并且如果他是管理员。 对该数据的更改只能使用 firebase 云功能进行。 要检查用户是否是管理员或具有角色,请对经过身份验证的用户进行简单的“存在”检查,以及他是否存在相应的角色或管理员状态。
在 firestore 中,您甚至可以拥有如下所示的辅助函数:
//Checks if user is signed in
function isSignedIn() {
return request.auth.uid != null;
}
//Checks if user has admin rights
function isAdmin() {
return exists(/databases/$(database)/documents/admins/$(request.auth.uid))
}
//Checks if user has a specific grant
function hasGrant(grant) {
return get(/databases/$(database)/documents/user_grants/$(request.auth.uid)).data[grant]==true
}
//Checks if user is granted either as admin or with a grant
function isGranted(grant){
return isAdmin() || hasGrant(grant);
}
//Checks if user has specific UID
function isOwner(userUid){
return request.auth.uid == userUid
}
有些人会说使用customClaims
,但我绝不会推荐这样做。也许仅适用于管理员状态,仅此而已。它们的尺寸太小,无法容纳更大的角色系统。通过将角色存储到数据库中,您甚至可以实时更改它们。
要获取用户的角色和管理员状态,只需为该数据创建一个实时监听器。
关于Firebase/Firestore 用户访问权限和角色如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67991996/