Flutter 는 어떻게 경로 차단 을 완성 하고 권한 관 리 를 실현 합 니까?

6887 단어 Flutter경로
앞서 몇 편 에 서 는 플 루 로 의 경로 관리 와 전환 애니메이션 을 소 개 했 는데,이 편 에 서 는 경로 차단 을 어떻게 완성 하여 권한 관 리 를 실현 하 는 지 소개 한다.'이 길 은 내 가 열 고 이 나 무 는 내 가 심 는 것 이다."권한 이 없다 면 403 이 옵 니 다!"
관련 글
flutter 의 경로 와 관련 된 장 을 알 고 싶다 면 다음 장 을 찾 아 보 세 요.
//www.jb51.net/article/215167.htm
//www.jb51.net/article/214856.htm
//www.jb51.net/article/215564.htm
//www.jb51.net/article/215549.htm
//www.jb51.net/article/215569.htm
fluro 경로 차단 사고
fluro 자체 가 Flutter 자체 테이프 와 유사 한 onGenerateRoute 방법 을 제공 하지 않 았 습 니 다.우 리 는 두 가지 방식 으로 루트 차단 을 실현 할 수 있다.하 나 는 루트 를 정의 할 때 권한 이 부여 되 지 않 은 루트 주소 가 403 권한 이 부여 되 지 않 은 페이지 로 이동 하 는 것 이다.둘 째 는 FluroRouter 류 를 계승 하여 그 중의 일 부 를 다시 쓰 는 방법 이다.원본 코드 를 읽 으 면 하위 클래스 에서 navigateTo 방법 을 덮어 서 루트 차단 을 할 수 있 습 니 다.
경로 정의 시 차단
이런 방식 은 비교적 간단 하 다.먼저 맵 을 사용 하여 루트 테이블 을 정의 하고 루트 경로 에 대응 하 는 루트 프로세서 에 비 추어 루트 를 정의 할 때 루트 경로 와 권한 수여 루트 테이블 을 비교 해 야 한다.권한 수여 루트 테이블 에 있 으 면 루트 를 정상적으로 정의 한다.그렇지 않 으 면 403 인증 되 지 않 은 페이지 로 교체 합 니 다.코드 는 다음 과 같다.

//     
static final routeTable = {
  loginPath: Handler(
      handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    return LoginPage();
  }),
  dynamicDetailPath: Handler(
      handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    return DynamicDetailPage(params['id'][0]);
  }),
  splashPath: Handler(
      handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    return Splash();
  }),
  transitionPath: Handler(
      handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    return TransitionPage();
  }),
  homePath: Handler(
      handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    return AppHomePage();
  }),
};

//        
static final permissionDeniedHandler =
    Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
  return PermissionDenied();
});

//    
//     ,             
//       ,           
static void defineRoutes({List<String> whiteList}) {
  routeTable.forEach((path, handler) {
    if (whiteList == null || whiteList.contains(path)) {
      router.define(path, handler: handler);
    } else {
      router.define(path,
          handler: permissionDeniedHandler,
          transitionType: TransitionType.material);
    }
  });

  router.notFoundHandler = Handler(
      handlerFunc: (BuildContext context, Map<String, dynamic> params) {
    return NotFound();
  });
}
이런 방식 은 간단 하지만 루트 차단 이 효과 적 임 을 확보 하기 위해 서 는 루트 초기 화 전에 로그 인 정 보 를 통 해 루트 화이트 리스트 를 받 아야 한다.사용자 체험 을 개선 하기 위해 권한 관리(예 를 들 어 플래시 페이지,첫 페이지,로그 인 페이지)와 관련 되 지 않 은 페이지 를 미리 명 확 히 하고 이 페이지 를 직접 추가 할 수 있 습 니 다.
점프 시 차단
점프 할 때 차단 은 FluroRouter 의 하위 클래스 를 따로 정의 하고 navigatoTo 를 덮어 쓰 는 방법 으로 경로 차단 을 실현 해 야 합 니 다.여기 서 좀 특이 한 것 은 경로 가 이동 할 때 파 라 메 터 를 가지 고 있 을 수 있 기 때문에 경로 차단 을 정의 하 는 것 처럼 화이트 리스트 와 직접 비교 할 수 없다 는 것 이다.그러나 현재 경로 와 화이트 리스트 의 일치 여 부 를 판단 하기 위해 경로 일치 방법 을 정의 할 수 있 습 니 다.
fluro 는 경로 에 따라 해당 하 는 경로 일치 방법 을 제공 할 수 있 으 므 로 소스 코드 를 벗 겨 보면 match 방법 이 경로 와 일치 하 는 방법 을 발견 할 수 있 습 니 다.일치 하 는 데 성공 하면 일치 하 는 경로 의 대상 인 AppRouteMatch 를 되 돌려 주 고 일치 하지 않 으 면 null 을 되 돌려 줍 니 다.

/// Finds a defined [AppRoute] for the path value.
/// If no [AppRoute] definition was found
/// then function will return null.
AppRouteMatch? match(String path) {
  return _routeTree.matchRoute(path);
}
AppRouteMatch 클래스 는 AppRoute 클래스 route 속성 이 있 습 니 다.route 속성 아래 에 문자열 형식의 route 속성 이 있 습 니 다.즉,일치 하 는 경로 입 니 다.

class AppRoute {
  String route;
  dynamic handler;
  TransitionType? transitionType;
  Duration? transitionDuration;
  RouteTransitionsBuilder? transitionBuilder;
  AppRoute(this.route, this.handler,
      {this.transitionType, this.transitionDuration, this.transitionBuilder});
}
따라서 이 방식 을 통 해 화이트 리스트 의 경로 와 일치 하 는 지 확인 하고 일치 하지 않 으 면 403 페이지 로 이동 할 수 있다.우 리 는 FluroRouter 의 하위 클래스 Permission Router 를 정 의 했 습 니 다.두 가지 속성 이 있 는데 각각 화이트 리스트 목록 입 니 다whiteList 와 403 페이지 경로 주소permissionDeniedPath。덮어 쓴 navigateTo 방법 에서 경로 일치 방식 을 통 해 경로 차단 여 부 를 결정 합 니 다.

import 'package:flutter/material.dart';
import 'package:fluro/fluro.dart';

class PermissionRouter extends FluroRouter {
  List<String> _whiteList;
  set whiteList(value) => _whiteList = value;

  String _permissionDeniedPath;
  set permissionDeniedPath(value) => _permissionDeniedPath = value;

  @override
  Future navigateTo(
    BuildContext context,
    String path, {
    bool replace = false,
    bool clearStack = false,
    bool maintainState = true,
    bool rootNavigator = false,
    TransitionType transition,
    Duration transitionDuration,
    transitionBuilder,
    RouteSettings routeSettings,
  }) {
    String pathToNavigate = path;
    AppRouteMatch routeMatched = this.match(path);
    String routePathMatched = routeMatched?.route?.route;
    if (routePathMatched != null) {
      //                 ,              
      if (_whiteList != null && !_whiteList.contains(routePathMatched)) {
        pathToNavigate = _permissionDeniedPath;
      }
    }
    return super.navigateTo(context, pathToNavigate,
        replace: replace,
        clearStack: clearStack,
        maintainState: maintainState,
        rootNavigator: rootNavigator,
        transition: transition,
        transitionDuration: transitionDuration,
        transitionBuilder: transitionBuilder,
        routeSettings: routeSettings);
  }
}

이 방식 은 우선 모든 경로 에 대응 하 는 경로 처리 장 치 를 정의 한 다음 에 점프 할 때 차단 해 야 한다.따라서 홈 페이지 가 권한 수여 와 관련 이 없다 고 가정 하면 앱 이 시 작 된 후에 권한 수여 화이트 리스트 를 얻 을 수 있 고 시작 할 때 얻 을 필요 가 없 으 며 시작 할 때의 임 무 를 낮 추고 시작 속 도 를 가속 화하 고 사용자 체험 을 향상 시 킬 수 있다.
이상 은 Flutter 가 경로 차단 을 어떻게 완성 하고 권한 관 리 를 실현 하 는 지 에 대한 상세 한 내용 입 니 다.Flutter 경로 차단 에 관 한 자 료 는 저희 의 다른 관련 글 에 주목 하 십시오!

좋은 웹페이지 즐겨찾기