Flutter 는 어떻게 경로 차단 을 완성 하고 권한 관 리 를 실현 합 니까?
관련 글
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 경로 차단 에 관 한 자 료 는 저희 의 다른 관련 글 에 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Flutter】DateTime 전월의 일수를 취득한다달의 일수를 취득할 필요가 있어, 의외로 수요 있을까라고 생각했으므로 비망록 정도에 남겨 둡니다. DateTime 날짜에 0을 입력하면 전월 DateTime이 됩니다. 2021년 3월 0일 = 2021년 2월 28일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.