You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 4路由守卫:相对目标路由调用router.navigate()与权限控制

Angular 4路由权限控制与路由守卫相对导航实现方案

一、基于用户权限控制特定路由访问

要实现路由权限控制,Angular的CanActivate守卫是最适合的工具——它能在路由激活前拦截请求并校验用户权限。下面是具体的落地步骤:

1. 先搭建权限校验服务

首先需要一个服务来管理用户权限,比如AuthService,用来判断当前用户是否拥有目标路由的访问权限:

import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class AuthService {
  // 模拟用户权限列表,实际项目中可从后端接口获取
  private userPermissions = ['home', 'product/categoryB'];

  hasPermission(routePath: string): Observable<boolean> {
    return of(this.userPermissions.includes(routePath));
  }
}

2. 实现路由权限守卫

创建RoutePermissionGuard,注入AuthService和Router,实现CanActivate接口完成权限校验逻辑:

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { AuthService } from './auth.service';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({ providedIn: 'root' })
export class RoutePermissionGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {
    // 提取当前要访问的路由路径,适配你的路由结构
    const targetPath = state.url.split('/').slice(2).join('/');

    return this.authService.hasPermission(targetPath).pipe(
      map(hasPermission => {
        if (hasPermission) {
          return true; // 有权限,允许进入目标路由
        } else {
          // 无权限时导航到默认页面,比如home
          this.router.navigate(['/myApp/home']);
          return false;
        }
      })
    );
  }
}

3. 给目标路由绑定守卫

把守卫绑定到需要权限控制的路由上,比如你提供的categoryA路由:

const routes: Routes = [
  { path: '', redirectTo: '/myApp/home(secondary:xyz)', pathMatch: 'full' },
  { path: 'myApp', children: [
    { path: '', redirectTo: 'home', pathMatch: 'full' },
    { path: 'home', component: HomeComponent },
    { path: 'product', children: [
      { path: '', redirectTo: 'categoryA', pathMatch: 'full' },
      // 给categoryA路由添加权限守卫
      { path: 'categoryA', component: CategoryAComponent, canActivate: [RoutePermissionGuard] }
    ] }
  ] }
];

二、路由守卫中相对目标路由调用router.navigate()

在路由守卫里实现相对导航的核心是利用ActivatedRouteSnapshot的relativeTo配置,它能让你基于当前要访问的目标路由来计算导航路径。

核心用法示例

比如,当用户没有categoryA的权限时,想相对product路由导航到categoryB,可以这样写:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
  return this.authService.hasPermission('product/categoryA').pipe(
    map(hasPerm => {
      if (hasPerm) {
        return true;
      } else {
        // 相对目标路由的父级(product)导航到categoryB
        this.router.navigate(['../categoryB'], { relativeTo: route });
        return false;
      }
    })
  );
}

相对路径规则说明

  • ['../categoryB']:../表示向上跳一级(从categoryA的父路由product出发),再导航到categoryB
  • ['./subroute']:./表示当前路由的子路由(如果存在的话)
  • 直接写['sibling']:表示当前路由的同级路由(需确保relativeTo指向父路由)

内容的提问来源于stack exchange,提问作者Faruq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:10:56