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

Posted

技术标签:

【中文标题】Flutter/Firebase:管理功能是应用内功能还是云功能?【英文标题】:Flutter/Firebase: Admin features in-app or cloud functions? 【发布时间】:2020-05-01 14:06:13 【问题描述】:

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

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

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

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

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

【问题讨论】:

仅供参考,反引号用于标记代码位,而不是突出显示产品名称。 我不知道你说的不安全是什么意思。您所做的更改是否满足您的应用程序的需求?如果是这样,那就去做吧。 @DougStevenson 我所说的“不安全”是因为我在客户端初始化了一个用户,isAdmin 字段是否可以被其他人逆向工程并以某种方式设置为真?提前致谢 如果您想限制最终用户可以对文档中的数据执行的操作,您需要研究安全规则。如果没有良好的安全规则,您的数据可能完全不安全。 感谢您的澄清。我将仔细研究创建强大的安全规则:) 【参考方案1】:

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

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

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

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

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

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

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

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

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

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

我是否应该在另一个应用程序中构建管理面板并使用云 函数?

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

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

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


旁注:您可能对此article 感兴趣,其中详细说明了如何创建管理模块来管理用户访问权限和角色。 (免责声明:我是作者)。

【讨论】:

非常感谢您对这个很好的解释和清晰的解释。我一定会读你的文章。所以底线是我不必使用 Cloud Functions 而是可以使用自定义声明?而且由于我在客户端初始化了一个用户,isAdmin 字段是否可以被其他人反向工程并以某种方式设置为真?提前致谢。 如果您想使用isAdmin 标志,您需要编写一些安全规则以仅允许特定用户(超级管理员?)对其进行更新。如果有人识别出存储用户文档的集合名称和一个文档的 ID,如果安全规则不到位,他可以修改数据。如果您使用自定义声明,则不会遇到此问题,因为它们只能由 Firebase Admin SDK 从特权服务器环境设置(即从您完全控制的服务器中的云函数运行后端代码的 Firebase 项目)。这是我的文章可以帮助你的地方:-) “所以底线是我不必使用 Cloud Functions 而是可以使用自定义声明?” -> 不完全是。您在问题中引用 Cloud Functions 的方式更多是将它们用作用户前端和后端(Firestore 和/或存储)之间的“中间件”,而不是依赖于客户端 SDK 和安全规则。见这篇文章:medium.com/firebase-developers/… 啊,我明白了。再次非常感谢您的详尽解释。我肯定会深入研究您链接的两篇文章,连同您的回答,我想我现在更好地理解了这一切背后的整个conecpt。谢谢:)

以上是关于Flutter/Firebase:管理功能是应用内功能还是云功能?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase 应用内消息在发布时不起作用

Flutter:Firebase身份验证无需登录即可创建用户

使用flutter firebase在线/离线的用户存在

Flutter Firebase GoogleSignIn 在发行版中不起作用

Flutter Firebase如何控制通知在应用程序处于前台时不显示

Flutter Firebase Auth - PHP 服务器中的令牌验证问题