未认证的颤振web重定向用户



我有一个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()),
],
),

我使用GetX来处理认证状态。因此,我可以访问整个web应用程序的身份验证状态。根小部件由一个简单的Obx组成,用于检查身份验证状态并将用户发送到仪表板:

return Obx(() => (Get.find<AuthController>().loggedIn) ? Dashboard() : LoginScreen());

遗憾的是,这不起作用,因为url没有改变,只是内容改变了。url仍然是/login。

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

我也不想在我创建的每个Widget或页面中都创建一个check,因为这样做效率很低。是否有一种方法可以检查用户是否登录,如果没有,将用户重定向到输入的每个url的登录页面?

的例子:

  • www.adress.com/dashboard将重定向到www.adress.com/login如果用户未登录

是否有一种方法通常检查授权状态并使用GetX相应地重定向用户?

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

简短的摘要:是否有可能检查外部的实际小部件的认证状态(例如在GetMaterialApp)和重定向任何未经认证的用户登录页面,即使他们在/dashboard url输入?

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

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;
}

如果用户在你的web应用程序中请求任意页面,那么你可能想要在继续访问所请求的页面之前拦截登录页面。您可以通过向登录页面传递返回url来实现此目的…

main.dart

GetMaterialApp(
...
initialRoute: "/dashboard",
getPages: [
GetPage(name: "/login", page: () => Root()),
GetPage(
name: "/dashboard", 
page: () => Dashboard(), 
middlewares: [AuthMiddleware()]
),
],
),
class AuthMiddleware extends GetMiddleware {
RouteSettings? redirect(String? route) {
String returnUrl = Uri.encodeFull(route ?? '');
return !isAuthenticated
? RouteSettings(name: "/login?return=" + returnUrl)
: null;
}
}

然后在您的登录页面,登录后您可以直接返回到原始请求的意图…

login.dart

//after successful login...
String returnUrl = Get.parameters['return'] ?? '/';
Get.offAllNamed(returnUrl);

最新更新