Flutter安全守护插件guard_runner的使用

Flutter安全守护插件guard_runner的使用

特性

  • 防止未授权访问路由
  • 验证执行操作的权限
  • 根据用户的角色显示或隐藏小部件

安装

在项目的 pubspec.yaml 文件中添加 guard_runner 作为依赖:

dependencies:
  guard_runner: any

使用

设置角色、路由和isAdmin

首先,需要调用 GuardRunner.setup 来加载所有角色、路由及其相应的角色。

import 'package:guard_runner/guard_runner.dart';
...
/// 允许的所有角色
final List<String> roles = ['app_first_role', 'app_second_role', 'admin_role'];

/// 应用程序的路由及其相应的角色
final rolesByRoutes = GuardRunnerRouteModelList([
  GuardRunnerRouteModel(routeName: '/', roles: ['*']),
  GuardRunnerRouteModel(routeName: '/second-page', roles: ['app_first_role', 'app_second_role']),
  GuardRunnerRouteModel(routeName: '/third-page', roles: ['app_third_role']),
  GuardRunnerRouteModel(routeName: '/unauthorized-page', roles: ['*'])
]);

GuardRunner.setup(
  roles: roles,
  rolesByRoutes: rolesByRoutes,
  isAdminRole: 'admin_role');

检查路由是否有导航权限

警告:这是一个示例,你可以根据需要进行调整。

import 'package:guard_runner/guard_runner.dart';
...
@override
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      onGenerateRoute: (settings) {
        final routeName = settings.name;

        final routes = {
          '/': MyHomePage(title: 'GuardRunner Home Page'),
          '/second-page': SecondPage(),
          '/third-page': ThirdPage(),
          '/unauthorized-page': UnauthorizedPage(),
        };

        if (routes.keys.contains(routeName)) {
          final hasPermission = GuardRunner.hasPermissionFromRoute(routeName!);

          return MaterialPageRoute(
            builder: (context) {
              final toRoute = hasPermission ? routeName : '/unauthorized-page';
              return routes[toRoute]!;
            },
          );
        }

        assert(false, '需要实现 ${settings.name}');
        return null;
      },
    );
  }
}

在这个示例中,如果有权限,则导航到目标路由;如果没有权限,则跳转到未经授权页面。

验证权限

要验证用户是否有执行某个操作的权限,可以使用 GuardRunner.hasPermission 和/或 GuardRunner.hasPermissionFromRoute

import 'package:guard_runner/guard_runner.dart';
...

if (GuardRunner.hasPermission(['app_first_role'])) {
  doSomething();
} else {
  doNothing();
}

///
if (GuardRunner.hasPermissionFromRoute('/third-page')) {
  Navigator.of(context).pushNamed('/third-page');
} else {
  Navigator.of(context).pushNamed('/third-page');
}

使用 GuardRunnerVisibility 显示或隐藏小部件

GuardRunnerVisibility 是一个可以根据角色参数显示或隐藏其子部件的小部件。

import 'package:guard_runner/guard_runner.dart';
...
GuardRunnerVisibility(
  child: Text('显示因为有权限...'),
  roles: ['app_first_role'],
)

传递通配符作为参数

如果你希望某个路由完全访问或显示 GuardRunnerVisibility 的子部件,可以传递通配符作为参数。

import 'package:guard_runner/guard_runner.dart';
...

/// 在路由中使用通配符的示例
GuardRunnerRouteModel(routeName: '/', roles: ['*']),

/// 使用通配符与 GuardRunnerVisibility 的示例
GuardRunnerVisibility(
  child: Text('显示因为有权限...'),
  roles: ['*'],
)

设置isAdmin

如果你希望给用户完全访问权限,可以在调用 GuardRunner.setup 时设置 isAdminRole 属性。

isAdminRole 是可选的,如果定义且包含在角色列表中,则将定义完全访问权限。

import 'package:guard_runner/guard_runner.dart';
...
/// 允许的所有角色
final List<String> roles = ['app_first_role', 'app_second_role', 'admin_role'];

GuardRunner.setup(
  roles: roles,
  rolesByRoutes: rolesByRoutes,
  isAdminRole: 'admin_role');

更多关于Flutter安全守护插件guard_runner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全守护插件guard_runner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用guard_runner插件来进行安全守护的示例代码。guard_runner是一个帮助开发者在Flutter应用中实现安全机制的插件,比如防止代码注入、反调试等。需要注意的是,guard_runner可能并不是官方广泛认可的插件名称,这里假设它是一个假想的或第三方插件,用于演示目的。实际使用中,请根据具体插件的文档进行调整。

首先,确保你的Flutter项目已经创建并配置好。接下来,按照以下步骤添加和使用guard_runner(假设它已经存在于pub.dev或作为一个本地插件)。

  1. 添加依赖: 在pubspec.yaml文件中添加guard_runner依赖:

    dependencies:
      flutter:
        sdk: flutter
      guard_runner: ^x.y.z  # 替换为实际的版本号
    

    然后运行flutter pub get来安装依赖。

  2. 导入插件: 在你的主文件(通常是main.dart)或其他需要使用安全守护功能的文件中导入guard_runner

    import 'package:guard_runner/guard_runner.dart';
    
  3. 初始化插件: 在main函数中初始化guard_runner插件,并设置必要的安全检查。这里假设guard_runner提供了initializeGuards方法来进行初始化:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await GuardRunner.initializeGuards(
        enableCodeInjectionProtection: true,
        enableDebugDetection: true,
        // 其他安全选项...
      );
    
      runApp(MyApp());
    }
    
  4. 处理安全检查结果: 根据插件的API,你可能需要处理安全检查结果,比如当检测到调试模式或代码注入时执行特定操作。假设guard_runner提供了isDebuggerAttachedhasCodeInjection方法来检查这些状态:

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        if (GuardRunner.isDebuggerAttached) {
          // 执行当检测到调试器时的操作,比如显示警告信息或退出应用
          return MaterialApp(
            home: Scaffold(
              appBar: AppBar(title: Text('Debugger Detected')),
              body: Center(
                child: Text('This app cannot be run in debug mode.'),
              ),
            ),
          );
        } else if (GuardRunner.hasCodeInjection) {
          // 执行当检测到代码注入时的操作
          return MaterialApp(
            home: Scaffold(
              appBar: AppBar(title: Text('Code Injection Detected')),
              body: Center(
                child: Text('Code injection detected. Exiting app.'),
              ),
            ),
          )..navigatorKey.currentState!.popUntil((route) => false); // 退出应用
        } else {
          // 安全环境,显示正常应用
          return MaterialApp(
            home: MyHomePage(),
          );
        }
      }
    }
    
  5. 运行应用: 使用flutter run命令运行你的应用。如果插件配置正确,并且检测到不安全的环境(如调试模式或代码注入),应用将显示相应的警告信息或执行退出操作。

请注意,上述代码是一个假设性的示例,因为guard_runner插件的具体API和功能可能有所不同。在实际使用中,请查阅该插件的官方文档以获取准确的API说明和使用指南。如果guard_runner不存在或功能不同,你可能需要寻找其他类似的安全插件或自己实现所需的安全机制。

回到顶部