如何解决防止未经授权的用户使用Flutter Web应用程序中的URL导航到路由?
我正在尝试在Flutter中创建一个Web应用程序,理想情况下,它可以像网站一样工作。用户将登录并能够看到其带有私人信息的仪表板,但是某些屏幕上包含公共信息,任何人都可以使用诸如myflutterapp.com/feed/usersPublicInfo
这样的动态路线URL导航到该屏幕,该链接可以发布到另一个网站上。例如,用户可以直接进入这条路线。
显然需要使用命名路由,但是什么阻止了某人直接进入私有信息所在的路由?还是至少阻止用户访问包含null
信息的页面并导致小部件崩溃?
解决方案1
使用命名的路由,并在登录屏幕之后,将用户变量传递到每个屏幕,并在生成路由之前进行nullcheck。如果为空,则表示有人跳过了某些路线,并将其发送回登录
解决方案2
如果可能,请混合使用命名路由和“未命名”路由,例如提要,仪表板和登录屏幕。用户进入仪表板后,所有路由都将使用Navigator.push()处理,从而防止从URL到达这些路由
其他解决方案?
我对Flutter和Flutter Web还是比较陌生,所以我可能会完全解决这个问题。我将不胜感激。 谢谢!
解决方法
解决方案1对我来说很好。
对于我的建议,使用Provider进行状态管理。这是基于我的上下文的示例:
routes: {
"/": (context) => MainPage(),"/detail": (context) => UserDetailPage(),"/other": (context) => OtherPage(),},builder: (context,child) {
return Consumer<UsersProvider>(
child: child,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
中使用构建器并定义路由,然后在内部构建器中使用Consumer是子代,是初始路由MainPage()
,因此,如果用户已经登录,他们将进入该位置,否则,将基于flag在我的上下文中是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
将返回其值。希望您能理解我的解释。我希望这对您也有帮助。
static Future<void> init() async {
WidgetsFlutterBinding.ensureInitialized();
if(kIsWeb) {
final String defaultRouteName = WidgetsBinding.instance.window.defaultRouteName;
if(!(defaultRouteName == 'home' || defaultRouteName == 'login' || defaultRouteName == '/')) {
SystemNavigator.routeUpdated(
routeName: '/',previousRouteName: null
);
}
}
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。