मेरे पास एक डैशबोर्ड प्रोजेक्ट के लिए फ़्लटर वेब में उपयोग किए जाने वाले नामित मार्गों के साथ GetMaterialApp है। हालांकि, मैं यह जांचने के लिए संघर्ष कर रहा हूं कि उपयोगकर्ता प्रमाणित है या नहीं और उपयोगकर्ता को स्थिति स्थिति के आधार पर पुनर्निर्देशित करता है। यह मेरा ऐप कोड है:

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 का उपयोग कर रहा हूं। इसलिए, मेरे पास पूरे वेब ऐप में प्रमाणीकरण स्थिति तक पहुंच है। प्रमाणीकरण स्थिति की जांच करने और उपयोगकर्ता को डैशबोर्ड पर भेजने के लिए रूट विजेट में एक सरल Obx होता है:

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

अफसोस की बात है कि यह चाल नहीं करता है, क्योंकि यूआरएल नहीं बदलता है, बस सामग्री करता है। यूआरएल /लॉगिन पर रहता है।

जब उपयोगकर्ता लॉग इन होता है तो मैं बस Get.toNamed("dashboard") को कॉल कर सकता हूं, लेकिन फिर डैशबोर्ड पृष्ठ यूआरएल के संपर्क में आ जाएगा, जिससे उपयोगकर्ता लॉग इन न होने पर भी/डैशबोर्ड यूआरएल तक पहुंच सकता है।

मैं अपने द्वारा बनाए गए प्रत्येक विजेट या पृष्ठ में एक चेक भी नहीं बनाना चाहता, क्योंकि वह अक्षम होगा। क्या यह जांचने का कोई तरीका है कि उपयोगकर्ता लॉग इन है या नहीं, यदि नहीं, तो उपयोगकर्ता को दर्ज किए गए प्रत्येक यूआरएल पर लॉगिन पेज पर रीडायरेक्ट करें?

उदाहरण:

क्या सामान्य स्थिति की जांच करने और उपयोगकर्ता को तदनुसार GetX का उपयोग करके पुनर्निर्देशित करने का कोई तरीका है?

साइड नोट: मैं हर बार सही प्रमाणीकरण स्थिति प्राप्त करने में सक्षम हूं, यह समस्या नहीं है, क्योंकि मैं GetX का उपयोग करता हूं।

संक्षिप्त सारांश: क्या वास्तविक विजेट (जैसे GetMaterialApp में) के बाहर प्रामाणिक स्थिति की जांच करना संभव है और किसी भी गैर-प्रमाणित उपयोगकर्ताओं को लॉगिन पृष्ठ पर रीडायरेक्ट करना संभव है, भले ही वे /डैशबोर्ड यूआरएल में टाइप करें?

1
lrsvmb 6 अगस्त 2021, 15:18

2 जवाब

सबसे बढ़िया उत्तर

यह जांचने के लिए मिडलवेयर का उपयोग करें कि उपयोगकर्ता प्रमाणित है या नहीं

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;
}
3
Pierre RAKOTODIMIMANANA 6 अगस्त 2021, 13:23

यदि उपयोगकर्ता आपके वेब ऐप के भीतर एक मनमाना पेज का अनुरोध करता है, तो आप अनुरोधित पेज पर जारी रखने से पहले लॉगिन पेज से इंटरसेप्ट करना चाह सकते हैं। आप लॉगिन पेज पर रिटर्न यूआरएल पास करके ऐसा कर सकते हैं...

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

फिर अपने लॉगिन पृष्ठ में, लॉग इन करने के बाद आप वापस उस स्थान पर जा सकते हैं जहां मूल अनुरोध का इरादा था ...

लॉगिन.डार्ट

    //after successful login...
    String returnUrl = Get.parameters['return'] ?? '/';
    Get.offAllNamed(returnUrl);
1
Matt Ireland 31 अगस्त 2021, 06:34