firebase - Firebase 身份验证仅管理员登录
问题描述
我正在构建两个将使用同一个 Firebase 项目的 Flutter 应用程序。
第一个应用程序是公开的,用户可以使用它在允许的访问规则内创建帐户、登录和使用应用程序。
第二个是管理员批准用户帖子。
您必须登录才能使用这两个应用程序。首先,任何人都可以创建一个帐户并登录。管理员也可以使用相同的管理员帐户登录。但是第二个只有管理员用户应该能够登录。我正在通过访问规则强制执行安全性。但我需要第二个管理应用程序首先拒绝非管理员用户登录。所以我不能简单地创建一个集合并将管理员用户 UID 放入其中。
我如何区分普通用户和管理员用户,最重要的是使用这种区别来禁止非管理员用户登录到管理员应用程序?
目前用于登录,我只是在使用
FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
我读到了一些叫做用户声明的东西,但似乎没有办法在仪表板中修改它,也没有办法通过上面的代码指定某种条件。
我希望这有足够的意义。
谢谢你们
解决方案
您不能阻止任何人登录您的应用程序。您可以做的最好的事情是检查用户是否是管理员。如果是,则继续,否则强制注销它们。您可以使用Firebase 自定义声明来添加管理员用户,甚至可以将他们的 UID 存储在 Firestore 或实时数据库中。
UserCredential userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword(
email: "barry.allen@example.com",
password: "SuperSecretPassword!"
);
// Check for claims here
if (admin) {
//...
} else {
await FirebaseAuth.instance.signOut();
// or just show alert that user is not an admin
}
您可以使用该getIdTokenResult
方法获取用户的自定义声明。这个答案解释了如何在 Flutter 中验证自定义声明。
推荐阅读
- ruby-on-rails - 无法在 Rails UI 中查看下拉选项
- java - Liquibase 日志级别更改
- android - Android WiFiManager.startScan 总是返回相同的结果
- java - 从 UI 到服务器(Java)的两个日期格式
- node.js - Node 中 express.js 和 axios.js 的区别
- javascript - 如何在 React 中加载 Google Places API
- python-3.x - Gekko 中间变量,错误:不等式或不等式的方程
- java - 错误:找不到符号以及如何创建对象并将其添加到数组列表
- python - 如何关闭使用单击选项打开的新选项卡?
- c++ - main 中需要将 class 作为参数的语法在哪里?