【发布时间】:2023-04-01 14:50:02
【问题描述】:
我正在构建一个包含 基于角色的授权 的 Flutter 应用程序,但我很困惑为什么我的应用程序会将角色为 user 的人发送到仅适用于人的仪表板屏幕谁拥有teacher 角色。
注意:目前这是一个巨大的安全坑。用户甚至不应该知道这个仪表板的存在。我希望我的应用程序能够立即从 Cloud Firestore 获取用户文档并读取他们的角色。如果他们的角色是用户,请将他们发送到主屏幕。否则,角色必须是教师,所以将他们发送到教师仪表板。
我所看到的:我的应用程序将普通用户发送到仪表板约 2 秒,然后加载一点,然后将他们带到 HomeScreen。这意味着普通用户可以看到不应该发生的仪表板屏幕!
下面是我的代码:
bool isUser = false;
@override
Widget build(BuildContext context) {
final authService = Provider.of < FirebaseAuthService > (context, listen: false);
return StreamBuilder < User > (
stream: authService.onAuthStateChanged,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
var user;
if (snapshot.data != null) {
user = snapshot.data;
populateUserInfo(context, user.uid);
}
if (user == null) {
return LoginScreen();
} else {
if (isUser) return HomeScreen();
else return DashboardScreen();
}
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator()
)
);
}
},
);
}
Future < void > populateUserInfo(BuildContext context, String uid) async {
final database = Provider.of < FirestoreService > (context, listen: false);
isUser = await database.isUser(uid);
}
也许一种解决方法是在应用程序中设置手动延迟一段固定的时间,但该解决方案似乎非常手动且不安全。我不确定这是否是模拟器问题,因为它需要在我构建应用程序后同步文件。
有没有办法解决这个问题?
编辑(后续问题) - 有没有办法在 StreamBuilder 中运行异步任务而不返回空小部件?
【问题讨论】:
标签: firebase flutter google-cloud-firestore firebase-authentication