Angular的canLoad和canActivate之间的区别?


98

canLoad和之间有什么区别canActivate

export interface Route {
  path?: string;
  pathMatch?: string;
  matcher?: UrlMatcher;
  component?: Type<any>;
  redirectTo?: string;
  outlet?: string;
  canActivate?: any[];
  canActivateChild?: any[];
  canDeactivate?: any[];
  canLoad?: any[];
  data?: Data;
  resolve?: ResolveData;
  children?: Routes;
  loadChildren?: LoadChildren;
}

我什么时候应该选哪个?

Answers:


97

canActivate用于防止未经授权的用户访问某些路由。有关更多信息,请参阅文档

如果未获得用户的授权,canLoad用于防止应用程序延迟加载整个模块。

有关更多信息,请参见下面的文档和示例。

{
    path: 'admin',
    loadChildren: 'app/admin/admin.module#AdminModule',
    canLoad: [AuthGuard]
},

使用此代码,只有AuthGuard返回时,才会将AdminModule的代码加载到应用程序中true

如果用户无权访问此路由,而我们仅使用了canActivate防护,则AdminModule即使用户无法访问该路由,也将加载该防护。


6
如果canActivate在上述情况下使用,会有什么区别?
k11k2

3
带有canActive模块的@ k11k2将被加载(F12> Sources-chrome)。您可以在其中看到.js文件。使用canLoad这些模块(文件.js文件)将不会加载:)在上面我作更好解释的地方检查我的答案
DiPix

23
管理员登录后,通过加载管理模块的情况canLoad返回true,然后注销应用程序。现在,非管理员用户在同一浏览器中登录,它如何工作?加载的模块是否被逐出或从缓存中删除了?
Keerthivasan '18年

2
当用户注销并使用没有足够权限来加载AdminModule的另一个帐户再次登录时,@ Keerthivasan不会强制删除以前加载的惰性AdminModule块。但是,无论如何您都不会获得访问权限。。我认为这不是一个真正的安全问题,因为通常一台设备是一个真实用户
hastrb

1
@ sgClaudia98可以同时使用,但是执行警卫的顺序严格。这就是为什么您的情况对我之前所说的没有影响。我想我在第一条评论中做了非常详细的解释。如果现在只有一台设备并且admin / not admin登录,那将是非常奇怪的情况。
hastrb

36
  • CanActivate-确定是否可以激活路由,此防护可能不是延迟加载的功能模块的最佳方式,因为此防护将始终将模块加载到内存中,即使该防护返回false,这也意味着用户无权访问路线。
  • CanLoad-决定是否可以延迟加载模块,控制是否可以加载路由。这对于延迟加载的功能模块很有用。如果警卫队返回假,他们甚至不会加载。

这是我对两个后卫使用延迟加载的功能模块进行的测试:

1.可以激活Guard测试

您会在“网络”页面的底部注意到,它发出了24个9.5 MB大小的请求,这些请求在3.34秒内完成传输,并在3.47秒内完成加载。

可以在延迟加载的功能模块上激活Guard测试

1. CanLoad Guard测试

在这里,当我们使用CanLoad Guard时,您会看到很大的不同,因为浏览器仅发出了9.2 MB大小的18个请求,在2.64秒内完成了传输,并在2.59秒内完成了完全加载。

在延迟加载的功能模块上进行CanLoad Guard测试

如果用户未授权,CanLoad Guard永远不会加载模块数据,这将为您带来更高的性能,因为加载时间减少了将近1秒钟,这是加载网页的巨大时间,毫无疑问,这取决于模块的大小。

提示: 如果要在项目上进行测试,请确保Disable Cache选中“网络”选项卡中的复选框,该复选框已在第一张图像中标记


2
只是不要混淆别人.. 403 Forbbiden,不能擅自这是401
hastrb

20

关于其他帖子中的评论问题, “如果在上述情况下使用canActivate,会有什么区别?”

实际上,对于用户而言,这没有什么区别,在两种情况下,他都无法访问该页面。虽然存在一个隐藏的差异。如果您按F12键并移至Sources(在Chrome中),则在其中下载文件。然后,您可以看到在下载带有代码的canActive文件的情况下(chunk.js)。即使您无权访问该页面。 在此处输入图片说明

但是如果使用canLoad,将不会包含带有源代码的chunk.js文件。

在此处输入图片说明

因此,正如您所看到的,这对安全性有很大的影响。

当然,不要忘记canLoad只能用于LazyLoaded模块


3
无法在“网络”选项卡中看到延迟加载模块的任何块,但是路由按预期工作,如何确认模块是否按需加载?
k11k2 '18

@ k11k2如果要查看模块属于哪个文件,只需debugger;在构造函数中为该模块之一的组件添加一条语句。然后,您可以查看它是作为单独的块加载还是包含在诸如main之类的模块中。如果您在惰性模块中引用了与该模块不隔离的组件,则无论如何都可能会加载该组件。如果您看到此提示,则表明您正在过滤除JS文件以外的内容,或者需要将懒惰的模块拆分为常见的“真正的懒惰”部分。
Simon_Weaver

@ k11k2我认为您的“延迟加载模块”没有被延​​迟加载。确保已将loadChildren属性用作惰性模块路径的一部分。
hastrb

16

canActivate用于防止未经授权的用户

canLoad用于防止整个应用模块

canActivate的示例:

{ path: 'product',canActivate:[RouteGaurd], component : ProductComponent }

canLoad的示例:

{ path: 'user' , canLoad: [AuthenticGuard], loadChildren : './user/user.module#UserModule' }

对于将来的读者来说,canActive示例不是很懒,但是canLoad是..由于具有loadChildren。此外,angular的最新版本是..loadChildren: () => import('./user/user.module').then(m => m.UserModule)
hastrb

很简单的解释,喜欢它:)
KTM

16

所述CanLoad保护防止延迟加载模块的加载。通常,当我们不想让未经授权的用户导航到模块的任何路线,并且也停下来甚至看不到模块的源代码时,我们通常使用此防护。

Angular提供canActivate Guard,可以防止未经授权的用户访问路由。但这不会阻止模块的下载。用户可以使用chrome开发者控制台查看源代码。CanLoad Guard阻止下载模块。

实际上,CanLoad保护要加载的模块,但是一旦模块被加载,CanLoad保护将什么也不做。假设我们使用CanLoad Guard保护了未经身份验证的用户的模块加载。当用户登录后,该模块将适用于加载,并且我们将能够导航该模块配置的子路径。但是,当用户注销后,由于模块已加载,因此用户仍将能够导航那些子路径。在这种情况下,如果我们想保护子路径免受未授权用户的侵害,我们还需要使用CanActivate保护。

在加载AdminModule之前使用CanLoad

  {
        path: 'admin',
        loadChildren: 'app/admin/admin.module#AdminModule',
        canLoad: [ AuthGuardService ]
      },

加载AdminModule后,在AdminRouting模块中,我们可以使用CanActive来保护孩子免受未授权用户的侵害,例如以下情况:

{ 
      path: '',
      component: AdminComponent,
      children: [ 
        {
          path: 'person-list',
          component: PersonListComponent,
          canActivate: [ AuthGuardService ]
        }
      ]
    }  

因此,应该同时使用canLoad和canActivate吗?
Tarida George

0

如果未经授权的用户进入,仍然可以激活该模块。您需要canLoad来判断是否需要加载。


0

重要的是要注意canLoad不会阻止某人获取您的源代码。除非用户授权,否则浏览器不会下载.js,但是您可以通过在浏览器控制台上发布import('./ xxxxx.js')来强制进行手动下载。

可以在路由定义的main.js上轻松找到模块名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.