flutter - 防止未经身份验证的用户使用 Flutter Web 应用程序中的 URL 导航到路由?

标签 flutter routes flutter-web

我正在尝试在 Flutter 中创建一个 Web 应用程序,它在理想情况下可以像网站一样工作。用户将登录并能够查看包含私有(private)信息的仪表板,但某些屏幕包含公共(public)信息,任何人都可以使用动态路由 URL 导航到这些屏幕,例如:myflutterapp.com/feed/usersPublicInfo ,例如,可以将此链接发布到另一个网站,而用户可以直接进入此路线。
显然,使用命名路由是我需要的解决方案,但是是什么阻止了某人直接进入包含私有(private)信息的路由?或者至少阻止用户访问带有 null 的页面信息并导致小部件崩溃?
解决思路1
使用命名路由并在登录屏幕之后,将用户变量传递到每个屏幕,并在生成路由之前进行空检查。如果为空,则表示有人跳过了一些路由,然后将它们发送回登录
解决思路2
如果可能,混合使用命名路由和“未命名”路由,例如提要、仪表板和登录屏幕。一旦用户进入仪表板,所有路由都使用 Navigator.push() 处理,防止从 URL 访问它们
其他解决方案?
我对 flutter 和 flutter 网络相当陌生,所以我可能会在这个问题上完全错误。我会很感激一些建议。
谢谢!

最佳答案

解决方案 1 对我来说看起来不错。
我的建议使用 Provider用于状态管理。这是我基于上下文的示例:

    routes: {
      "/": (context) => MainPage(),
      "/detail": (context) => UserDetailPage(),
      "/other": (context) => OtherPage(),
    },
 builder: (context, child) {
          return Consumer<UsersProvider>(
            child: child,
            builder: (context, provider, child) {
              if (provider.isLoading) {
                return Scaffold(
                  body: Center(
                    child: CircularProgressIndicator(),
                  ),
                );
              }

              final value = provider.user;
              if (value == null) {
                return Navigator(
                  onGenerateRoute: (settings) => MaterialPageRoute(
                      settings: settings, builder: (context) => LoginPage()),
                );
              }

              return MultiProvider(
                providers: [
                  ChangeNotifierProvider(create: (context) => UsersProvider()),
                  ChangeNotifierProvider(
                      create: (context) => InvoicesProvider()),
                  ChangeNotifierProvider(create: (context) => EventsProvider()),
                ],
                child: child,
              );
            },
          );
基本上在 main.dart 中使用 builder并定义路由,然后在 builder 中使用 Consumer are child 是初始路由 MainPage()所以如果用户已经登录,他们会去那里,如果没有,基于我上下文中的标志是 isAdmin他们将重定向到 LoginPage()。因此,如果他们尝试使用 url 来查看详细信息或其他内容,他们将重定向到 LoginPage反正。
这是我的 UserProvider:
  getUser() async {
    FirebaseAuth.instance.onAuthStateChanged.listen((currentUser) async {
      _isLoading = false;
      if (currentUser == null) {
        _user = null;
        notifyListeners();
        return;
      }
      final data = await Firestore.instance
          .document("users/${currentUser.uid}")
          .snapshots()
          .first;
      if (data.exists) {
        print(data.data);
        if (data.data['is_admin'] == true) {
          _user = User.fromMap(data.data);
          notifyListeners();
        }
        return null;
      }
    });
  }
所以如果用户 isAdmin它将返回它们的值。我希望你能理解我的解释。我希望这对你也有帮助。

关于flutter - 防止未经身份验证的用户使用 Flutter Web 应用程序中的 URL 导航到路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63612663/

相关文章:

flutter - 私有(private)实例变量有什么用?

firebase - Flutter Firestore 离线时检索数据需要很长时间

Flutter Web - TextFormField 禁用复制和粘贴

flutter-web - 如何在 Debug模式下构建 Flutter Web 应用程序?

firebase - 带有 Firebase Auth 的 Flutter Web 无法在本地工作,但在部署在云中时可以工作

android - Flutter build appbundle 不创建 64 位并添加不必要的权限?

flutter : Keep User Login with SharedPreferences

ruby - Rails 3 - 限制资源路由中的操作格式

routes - 如何在 Swisscom CloudFoundry 中创建后备路由

ruby-on-rails - rails 3 - 在资源上使用 form_for 时出现路径错误