我正在尝试在 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/