使用Firebase Auth自定义声明获得自定义权限

时间:2020-07-15 19:49:16

标签: firebase security authentication firebase-authentication authorization

初始情况:

我正在开发主要使用的应用程序(iOS,Android,Web应用程序) Firebase身份验证电子邮件和密码,以授权我的用户并管理权限

复杂的配置选项,以确保安全性和 可以为每个用户分别设置的访问设置。那里 也是预制角色(例如管理员,经理等)。但是,这些 只是模板,不需要 管理用户帐户。 权限可以自定义 每个用户和整个应用程序


我的方法:

使用Firebase Auth自定义声明

由于非常可定制的权限模型,我想到了 为每个许可授予一个数字,如下所示:

2000:  Calendar (Full access)
2001:  Calendar (View access)
2002:  Calendar (Create access)
2003:  Calendar (Edit access)
2004:  Calendar (Delete access)

然后我认为存储权限是一个好主意 true作为boolean (因为尺寸小于 Integer的自定义声明中的user),如下所示:

// User with permissions to view the calendar, create and edit events but not authorized to delete:
'claims': {
   '2001': true,
   '2002': true,
   '2003': true
 }

// User with full access to the calendar 
'claims': {
   '2000': true
 }

权限也存储在Firebase Cloud Firestore中。

Cloud Firestore
  >  users
     >  [unique_user_id]
       >  permissions

在客户端检查权限

当用户打开应用程序时,系统在首次加载时执行两次 读取到Firebase Cloud Firestore以检索所有当前 元数据以正确设置应用程序。此数据保存在本地。它 包含可以正确显示所有内容的元数据,也可以包含用户的 权限。这样,用户界面已经阻止了用户 访问不可见的内容或采取措施 (创建,编辑,删除)。

通过Firebase Cloud Firestore的安全规则在服务器端检查权限

因为客户端操作可能由用户或 用户在使用时更改单个用户的权限 应用程序,需要一些高级安全工具 提高应用程序的整体安全性。这应该在 通过Cloud Functions和Firebase的安全规则在服务器端 Cloud Firestore。

安全规则可能如下所示:

service cloud.firestore {
 match /databases/{database}/{project_id} {
   match /calendar/{event} {
       allow read: if request.auth.token.2000 == true || request.auth.token.2001 == true;
       allow write: if request.auth.token.2000 == true || request.auth.token.2002 == true;
       allow update: if request.auth.token.2000 == true || request.auth.token.2003 == true;
       allow delete: if request.auth.token.2000 == true || request.auth.token.2004 == true;
   }

}

我还可以使用Cloud Function来检查所有 用户对数据库执行的每个操作之前的权限。但是这个 将导致每个用户的许可再次读取 已执行的操作。这会导致我的金额更高 Firebase帐单。我尽量避免这种情况!


问题

您对此有何看法,有更好的解决方案吗?我不确定这是否是真的。

我还使用Microsoft作为提供程序来授权用户,而不是创建新帐户。这是否也适用于通过Microsoft登录的用户?

0 个答案:

没有答案