Как предотвратить перенаправление приложением Flutter неверной страницы? - PullRequest
0 голосов
/ 23 марта 2020

Я создаю приложение 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 без возврата нулевого виджета?

1 Ответ

0 голосов
/ 23 марта 2020

Проблема в том, что ваше приложение ожидает разрешения в будущем, и, как только оно это сделает, оно корректирует разрешения и ваше приложение ведет себя правильно. И это происходит потому, что ваше состояние находится в синхронной части вашего кода. Вы можете исправить это, добавив условия к асинхронной части, выполнив что-то вроде этого:

if (snapshot.data != null) {
    user = snapshot.data;
    populateUserInfo(context, user.uid).then((bool value) => {
        isUser = value;
        if (user == null) {
            return LoginScreen();
        } else {
            if (isUser) return HomeScreen();
            else return DashboardScreen();
        }
    });
}else{
    // you logic in case the snapshot is null
}

Кроме того, вам придется изменить функцию populateUserInfo на:

Future < bool > populateUserInfo(BuildContext context, String uid) async {
    final database = Provider.of < FirestoreService > (context, listen: false);
    return await database.isUser(uid);
}

ПРИМЕЧАНИЕ : это не проверено, но оно должно быть хорошей отправной точкой для исправления, если оно не работает сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...