gpt4 book ai didi

angular - 试图了解 CanActivate 和 CanActivateChild 之间的区别

转载 作者:太空狗 更新时间:2023-10-29 17:08:50 24 4
gpt4 key购买 nike

因此,我试图通过使用守卫来保护对多条路线的访问。我正在使用以下路线这样做:

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
}

}

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

Guarding...

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

Guarding children...

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

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

最佳答案

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

示例:您可能遇到这样一种情况,用户必须经过身份验证才能导航到根组件,但必须具有“x”权限才能访问子组件。在这种情况下,canActivateChild 不必为每个 child 添加 canActivate 守卫,从而节省了大量的输入。

编辑:

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

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

这需要自上而下的保护。不得未经授权访问任何路由,包括根路由和子路由。在这种情况下,根级别的 canActivate 可以很好地保护所有内容。

但是你也可能有一些时候你有一个功能模块,其中只有某些 child 需要看管:

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

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

这实际上完全取决于您的要求,但是同时拥有 canActivatecanActivateChild 选项会更好。

关于angular - 试图了解 CanActivate 和 CanActivateChild 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com