Flutter/Firebase:管理功能是应用内功能还是云功能?

Ras*_*ian 2 firebase firebase-authentication flutter google-cloud-functions google-cloud-firestore

我正在使用 Flutter 和 Firebase 编写一个应用程序(目前使用 Firestore、Storage 和 Authentication)。

目前该应用程序显示来自 Firebase 的内容,但现在我正在尝试找出在 Firebase 中实现写入/编辑/删除内容的最佳方法。

目标是让用户拥有管理员权限。

我的问题是我是否可以在客户端应用程序中构建一个管理面板(这将是理想的),或者如果这被认为是不好的做法,我应该在另一个应用程序中构建一个管理面板并使用 Cloud Functions。

例如,目前我在 Flutter/Dart 代码中执行身份验证(注册/注册),并在注册时在 Firestore 中创建一个字段isAdmin = false,然后我可以在 Firestore 控制台中手动将其设置为 true(如果需要)。这可能是一种“不安全”的方式吗?

Ren*_*nec 6

目标是让用户拥有管理员权限

由于您正在使用身份验证服务,您已经拥有了一半的解决方案:通过身份验证,您可以识别使用您的应用程序的每个用户。

另一部分是授权:这通常通过 Firebase 中的安全规则完成,适用于 Firestore 和 Cloud Storage。

为了能够授权某些用户(通过身份验证识别)具有管理员权限,您需要知道哪些用户具有管理员角色,以便授权他们执行管理员功能。

isAdmin正如您在问题中提到的,识别管理员用户的一种可能方法是在 Firestore 的某些用户文档中设置一个标志。文档中有一个使用这种方法的 Firestore 安全规则示例。

但是,如果您想将此标志(存储在 Firestore 中)与云存储的安全规则一起使用,则会遇到一些问题。在撰写本文时,无法在 Cloud Storage 的安全规则中读取 Firestore 文档的值。

解决方案是使用Custom Claims。您将在文档中找到有关如何以满足您需求的方式实施它的所有详细信息。

我可以在客户端应用程序中构建管理面板吗?

是的,你可以很好地做到这一点。只要您的安全性得到正确实施(通过身份验证和安全规则,如上所述),就没有什么可以阻止您开发管理面板。如果不是管理员的用户可以访问管理面板,他/她将无法执行管理员操作(即写入/编辑/删除 Firestore 或 Cloud Storage 数据)。

此外,通过自定义声明,您可以在前端访问它们以根据用户的角色或访问级别修改客户端 UI(即,仅向管理员用户显示管理模块的页面、按钮和菜单项 - 但请注意,这不会阻止某人对您的应用程序进行逆向工程并执行专用于管理员用户的查询:这就是正确实施身份验证和安全规则部分的关键-)。请参阅自定义声明文档中的此部分

我应该在另一个应用程序中构建一个管理面板并使用 Cloud Functions 吗?

如果您不想使用一些逻辑来使您的应用程序过于复杂以隐藏/显示管理面板元素(基于自定义声明,请参见上文),您可以很好地在另一个应用程序中构建管理面板。

如果您有无法通过标准安全规则实现的特定需求/访问限制,您可以很好地使用一些 Cloud Functions 来检查用户是管理员并执行写入/编辑/删除管理员操作(但请注意,虽然它很从 Cloud Functions 与 Firestore 进行交互很容易,但使用 Storage 可能有点棘手:使用 Cloud Storage Client SDK 比通过 Cloud Functions 与 Cloud Storage 交互要容易得多)。

您最好使用 Callable Cloud Functions,因为“使用可调用函数,Firebase 身份验证和 FCM 令牌(如果可用)会自动包含在请求中”。(请参阅https://firebase.google.com/docs/functions/callable)。


旁注:您可能对本文感兴趣,它详细介绍了如何创建管理模块来管理用户访问和角色。(免责声明:我是作者)。