我正在开发主要使用的应用程序(iOS,Android,Web应用程序) Firebase身份验证电子邮件和密码,以授权我的用户并管理权限。
有复杂的配置选项,以确保安全性和 可以为每个用户分别设置的访问设置。那里 也是预制角色(例如管理员,经理等)。但是,这些 只是模板,不需要 管理用户帐户。 权限可以自定义 每个用户和整个应用程序。
由于非常可定制的权限模型,我想到了 为每个许可授予一个数字,如下所示:
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以检索所有当前 元数据以正确设置应用程序。此数据保存在本地。它 包含可以正确显示所有内容的元数据,也可以包含用户的 权限。这样,用户界面已经阻止了用户 访问不可见的内容或采取措施 (创建,编辑,删除)。
因为客户端操作可能由用户或 用户在使用时更改单个用户的权限 应用程序,需要一些高级安全工具 提高应用程序的整体安全性。这应该在 通过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登录的用户?