如果未经过身份验证,Flutter Web 会重定向用户

lrs*_*vmb 1 firebase flutter flutter-web flutter-getx

我有一个带有命名路由的 GetMaterialApp,可在 Flutter Web 中用于仪表板项目。但是,我正在努力检查用户是否经过身份验证并根据身份验证状态重定向用户。这是我的应用程序代码:

GetMaterialApp(
      initialBinding: InitialBinding(),
      debugShowCheckedModeBanner: false,
      theme: CustomTheme().getLightTheme,
      themeMode: ThemeMode.light,
      title: "----------",
      initialRoute: "/login",
      unknownRoute: GetPage(name: "/notfound", page: () => NotFoundPage()),
      getPages: [
        GetPage(name: "/login", page: () => Root()),
        GetPage(name: "/dashboard", page: () => Dashboard()),
      ],
    ),
Run Code Online (Sandbox Code Playgroud)

我用来GetX处理身份验证状态。因此,我可以访问整个 Web 应用程序的身份验证状态。Root 小部件包含一个简单的命令,Obx用于检查身份验证状态并将用户发送到仪表板:

return Obx(() => (Get.find<AuthController>().loggedIn) ? Dashboard() : LoginScreen());
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这并不能解决问题,因为 url 没有改变,只是内容改变了。URL 仍为 /login。

我可以简单地Get.toNamed("dashboard")在用户登录时调用,但随后仪表板页面将暴露给该 url,允许用户即使未登录也可以访问 /dashboard url。

我也不想在我创建的每个小部件或页面中创建检查,因为那样效率低下。有没有办法检查用户是否登录,如果没有,则将用户重定向到输入的每个网址的登录页面?

例子:

有没有一种方法可以检查身份验证状态并相应地使用重定向用户GetX

旁注:我每次都能获得正确的身份验证状态,这不是问题,因为我使用 GetX。

简短摘要: 是否可以检查实际小部件之外的身份验证状态(例如在 GetMaterialApp 中)并将任何未经身份验证的用户重定向到登录页面,即使他们输入 /dashboard url?

小智 5

使用中间件检查用户是否经过身份验证

GetMaterialApp(
      initialBinding: InitialBinding(),
      debugShowCheckedModeBanner: false,
      theme: CustomTheme().getLightTheme,
      themeMode: ThemeMode.light,
      title: "----------",
      initialRoute: "/dashboard",
      unknownRoute: GetPage(name: "/notfound", page: () => NotFoundPage()),
      getPages: [
        GetPage(name: "/login", page: () => Root()),
        GetPage(name: "/dashboard", page: () => Dashboard(), middleware: [AuthMiddleware()]),
      ],
    ),

class AuthMiddlware extends Middlware {
   RouteSetting? redirect(String? route) => !isAuthenticated ? RouteSetting(name="/login") : null;
}
Run Code Online (Sandbox Code Playgroud)