Я создаю приложение Flutter, которое включает Role Based Authorization , и меня смущает, почему мое приложение отправляет человека с ролью user
на экран Dashboard, который предназначен только для людей, которые иметь роль teacher
.
Примечание. Сейчас это огромная дыра в безопасности. Пользователь никогда не должен знать, что эта панель инструментов существует. Я ожидаю, что мое приложение немедленно получит пользовательский документ из Cloud Firestore и прочитает его роль. Если их роль - пользователь, отправьте их на главный экран. Иначе, роль должна быть учителем, поэтому отправьте их на панель учителя.
То, что я вижу: мое приложение отправляет обычного пользователя на панель инструментов в течение ~ 2 секунд, затем немного загружает и затем переносит их на домашний экран. Это означает, что обычный пользователь может видеть экран Dashboard, чего не должно быть!
Вот мой код ниже:
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);
}
Возможно, обходной путь - установить ручную задержку в приложении на фиксированный промежуток времени, но это решение кажется очень волнистым и небезопасным. , Я не уверен, что это проблема с эмулятором, потому что после синхронизации приложения нужно синхронизировать c файлы.
Есть ли способ исправить эту проблему?
EDIT (дополнительный вопрос) - Есть ли способ запустить асинхронную задачу в StreamBuilder без возврата нулевого виджета?