尝试了解 CanActivate 和 CanActivateChild 之间的区别

2023-12-23

所以,我试图通过使用警卫来保护通往几条路线的通道。我正在使用以下路线来执行此操作:

const adminRoutes : Routes = [
  {
    path: 'admin',
    component: AdminComponent,
    canActivate: [ AuthGuardService ],
    children : [
      {
        path: '',
        canActivateChild: [ AuthGuardService ],
        children: [
          { path: 'edit', component: DashboardComponent},
          { path: '', component: DashboardComponent}
        ]
      }
    ]
  }
];

这是什么AuthGuardService好像

import { Injectable } from '@angular/core';
import {CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot} from "@angular/router";

@Injectable()
export class AuthGuardService implements CanActivate{

  constructor(private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    console.log("Guarding...");
    return this.sessionValid();
  }

  canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    console.log("Guarding children...");
    return this.canActivate(route, state);
  }

  sessionValid() : boolean {
    //tests
  }

}

当我尝试访问“/admin”和“/admin/edit”时canActivate only (canActivateChild被注释)控制台显示

Guarding...

当我删除时canActivate并带来canActivateChild返回控制台显示

Guarding children...

当我保留两者时,它会返回显示Guarding...。 所以,我的问题是这样做的目的是什么canActivateChild when canActivate保护根元素和子元素?

PS:我明白了canActivateChild在激活子路由之前运行。但这样做有什么好处呢?只保留其中之一还不够吗?


两者都很重要,因为您可能有不同的要求,用户可以访问根组件,但可能不满足子组件的条件。

示例:您可能会遇到这样的情况:用户必须经过身份验证才能导航到根组件,但必须具有权限“x”才能访问子组件。在这样的情况下,canActivateChild无需添加即可节省大量打字时间canActivate守护着每一个孩子。

EDIT:

例如,您可能有一个管理模块,其中所有路由都需要防止未经授权的进入:

  {
    path: 'admin',
    component: AdminComponent,
    canActivate: [ AuthGuardService ],
    children : [
      {
        path: '', component: ...,
      },
      {
        path: 'manage-users', component: ...,
      },
      {
        path: 'manage-roles', component: ...,
      }
    ]
  }

这需要自上而下的保护。未经授权不得访问任何路由,包括根路由和子路由。在这个情况下canActivate从根本上来说,它可以很好地保护一切。

但有时您也可能有一个功能模块,其中只需要保护某些子项:

  {
    path: 'featureA',
    component: ...,
    canActivateChild: [ AuthGuardService ],
    children : [
      {
        path: 'manage-feature', component: ...,
      },
      {
        path: 'manage-members', component: ...,
      }
    ],
    {path: 'featureB', component: ...}
  }

在这种情况下,也许所有用户都需要访问根组件“featureA”和“featureB”,但只有某些用户需要能够导航到“featureA”的子路由。在这种情况下,更容易在根级别使用一个防护来保护子级,而不是根本身。另一种方法是把canActivate每条儿童路线都有警卫,这可能会很乏味。

这实际上完全取决于您的要求,但同时拥有这两种选择可能会很好canActivate and canActivateChild.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试了解 CanActivate 和 CanActivateChild 之间的区别 的相关文章

随机推荐

  • 为什么 python 模块可以在 shell 中工作,但不能在脚本中工作?

    我正在尝试制作两个程序 我想要一台打印我居住城市的当前天气 而我想要另一台从在线帐户获取数据并将其返回 对于这些脚本 我导入 yweather 模块和 requests 模块 当我将它们导入 shell 时没有问题 但是当我运行脚本时它显示
  • 代码顺序和性能

    我想找到哪个更快 结构与数组 因此 我编写了一段 GO 代码 其中将 4 个 int 值 1 2 3 和 4 写入结构体的成员 然后写入长度为 4 的数组 我试图找出写入所需的时间 Case1 首先 我将值写入结构体 然后写入数组 在这里我
  • 为什么顺风找不到我的动态类?

    所以我尝试根据对象数组动态加载类 div item name div 我检查了浏览器上的元素面板 类属性加载正确 但 css 没有 为什么会这样 任何帮助将不胜感激 Tailwind 生成一个仅包含项目中使用的类的 CSS 文件 它无法识别
  • 使用 pecl oauth 为 LTI Outcomes 服务构建主体签名的 oauth xml 请求

    我正在使用 pecl oAuth 库 是否可以构建一个如下所示的正文签名的 oauth 请求 POST http www imsglobal org developers BLTI service handle php HTTP 1 0 H
  • 真正最小的口齿不清

    要使一种语言成为图灵完备且是 lisp 变体 所需的最小原语集是什么 看起来像 car cdr 和一些流量控制以及 REPL 的东西就足够了 如果有这样的清单就好了 假设只有 3 种数据类型 整数 符号和列表 就像 picolisp 中一样
  • 在android studio中创建AVD时出错

    我是 android studio 的新手 我的问题是当我尝试创建 AVD 时它的显示 未知错误 有关详细信息 请参阅 idea log 我正在 Windows 8 上工作 删除目录 home android avd 中的所有文件和文件夹
  • 奇怪的 Python Selenium 按钮点击行为

    我试图点击的部分 ul class btns right li a href class expand all View All Cards a li ul 我想很简单 但我似乎错过了一些东西 问题现在在页面下方更新了一点 xpath 不是
  • Docker compose 将本地目录映射到 dockerfile 卷

    我正在使用 Apache MySql Docker compose 设置 这一切都很好 然而 由于这是本地开发 因此问题出现了 Web 容器指向本地文件夹 而我需要 Apache 拥有该文件夹的权限 Using RUN mkdir www
  • WordPress:WP_Query 如何应用自定义帖子类型的搜索条件

    我有一个自定义帖子类型 photo 并且需要使用各种条件搜索与标题或描述与搜索关键字匹配的照片 包含LIKE search term 以 开始LIKE search term 等等 我有以下查询 但这不会根据 search term 请指引
  • Cython nogil 与 ThreadPoolExecutor 没有提供加速

    我假设如果我使用 Cython 编写代码nogil指令 这确实会绕过 gil 我可以使用ThreadPoolExecutor使用多个核心 或者 更有可能的是 我在实施过程中搞砸了一些事情 但我似乎不知道是什么 我使用 Barnes Hut
  • 使用 React-leaflet version3 的传单地图上的自定义按钮

    我是 React typescript 的新传单学习者 想要在地图上创建自定义按钮 单击该按钮后 将出现一个弹出窗口 我看到了很多例子 但它们都是基于旧版本的 我也尝试创建自己的例子 但没有成功 该文档也没有提供太多帮助 即使是功能性自定义
  • 我应该为这个带有 websockets 的 web 应用程序使用什么解决方案。活动MQ?

    我目前正在开发一个网络应用程序 它需要一个 websocket 连接来接收来自服务器的事件通知 客户端被分成组 并且组中的所有客户端必须接收相同的事件通知 我认为 ActiveMQ 可能可以支持这种模型 为每组客户端使用不同的队列 使用 s
  • 将 Oracle 外连接转换为 SQL Server

    我在将此 Oracle SQL 转换为 SQL Server 时遇到问题 这是查询 SELECT CM ModuleID CM ModuleDescription CM ImageIndex CASE WHEN CMAC ClassID I
  • 使用 Android 意图共享图像

    我正在尝试通过这样的共享意图来共享图像 Intent sharingIntent new Intent android content Intent ACTION SEND sharingIntent setType image png s
  • 如何使用 Pandas 从一个文件读取多个数据集?

    我有一个文件 其中包含由行分隔的多组数据 它看起来像 country1 0 9 1 3 2 9 1 1 country2 4 1 3 1 0 2 我想使用 Pandas 将整个文件读入多个数据帧 其中每个数据帧对应一个国家 地区 有什么简单
  • 如何从BroadcastReceiver获取数据到Activity?

    我编写了 SMS 应用程序 并为其编写了 BroadcastReceiver 我想从 BroadcastReceiver 获取数据到我的 Activity 中 那么如何获取它 我的广播接收器代码如下 public class SmsRece
  • Rails - 根据用户选择动态设置 time_zone

    感谢您对我的新网站功能之一的帮助 这是关于动态时区 根据要求用户可以从一组预定义时区 例如 us zones 中进行选择 当用户选择区域时 整个站点应设置 更新为时区 然而 目前新的时区还没有更新到 Apache 中 并且时区的更新仅在服务
  • 如果 ID 为数字,Bootstrap 手风琴将无法工作

    将 Bootstrap 升级到 4 2 1 版本后出现问题 在这个版本中 当我使用id 12 in accordion它不起作用 在以前的版本中 它可以很好地使用id 12 有任何想法吗 div div class card div cla
  • wait 命令不会等待子进程完成 c cpp c++

    我正在尝试编写一个 C 程序 该程序创建一个子进程 运行一个命令并将输出通过管道返回到父进程正在运行的命令的输入 我让父级执行 wait NULL 或 wait void pid 命令 但它不等待 这是代码 include
  • 尝试了解 CanActivate 和 CanActivateChild 之间的区别

    所以 我试图通过使用警卫来保护通往几条路线的通道 我正在使用以下路线来执行此操作 const adminRoutes Routes path admin component AdminComponent canActivate AuthGu