Flutter / Firebase:管理员具有应用内功能或云功能?

问题描述 投票:0回答:1

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

当前来自Firebase的应用程序显示内容,但现在我想弄清楚如何在Firebase中实现编写/编辑/删除内容的最佳方法。

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

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

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

firebase flutter google-cloud-firestore firebase-authentication google-cloud-functions
1个回答
1
投票

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

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

另一部分是授权:通常使用Firebase中的安全规则(针对Firestore和Cloud Storage)完成此操作。

要能够授权具有管理员权限的某些用户(通过authentication标识),您需要以授权用户执行管理功能的方式知道哪些用户具有管理员角色。

识别管理员用户的一种可能方法是,如您在问题中所述,在Firestore的某些用户文档中使用isAdmin标志。 documentation中有使用此方法的Firestore安全规则示例。

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

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

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

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

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

我是否应该在另一个应用中并使用Cloud构建管理面板功能?

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

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

您最好使用可调用的云功能,因为“带有可调用的功能,Firebase身份验证和FCM令牌(如果可用)会自动包含在请求中”。 (请参见https://firebase.google.com/docs/functions/callable。)>


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

© www.soinside.com 2019 - 2024. All rights reserved.