Costudy线上自习室:儿童路线上的警卫(angular guards)

我知道这个问题经常在 StackOverflow 上被处理。

我咨询了 Stack 上的几个帖子,但建议的解决方案对我不起作用。

例如this one

我第一次尝试使用 Guards 限制对页面的访问,但它不适用于子页面。

我有一个卡车模块包含这样的孩子:

Truck
  |_ truck-list
  |_ truck-search
  |_ truck-menu
  |_ truck-details

我有一个卡车模块的路线文件:

RouterModule.forChild([
    {path: 'list', component: TruckListComponent, canActivate: [TruckGuard]},
    {path: 'search', component: TruckSearchComponent, canActivate: [TruckGuard]},
    {path: 'details/:id', component: TruckDetailsComponent},
    {path: 'menu', component: TruckMenuListComponent},
    {path: 'menu/:id', component: TruckMenuListComponent},
    {path: 'menu/add/:id', component: TruckMenuAddComponent},
    ])

和一个应用程序路由模块:

const appRoutes: Routes = [
    { path: '', component: HomeComponent},
    { path: 'app-forbidden', component: ForbiddenComponent},
    { path: 'Home', component: HomeComponent},
    { path: 'About', component: AboutComponent},
    { path: 'forbidden', component: ForbiddenComponent},
    { path: 'Login', component: LoginComponent},
    { path: 'Logout', component: LoginComponent},
    { path: 'confirmation-commande/:message', component: ConfirmationCommandeComponent},
    { path: 'orders', component: OrderListComponent},
    { path: 'truck/search', component: TruckSearchComponent},
    { path: 'SignUp/customer', component: UseraccountCreateCustomerComponent},
    { path: 'SignUp/truck', component: UseraccountCreateTruckComponent},
    { path: 'useraccount', loadChildren: () => import('./useraccount/useraccount.module').then(u => u.UserAccountModule)},
    { path: 'truck', loadChildren: () => import('./truck/truck.module').then(t => t.TruckModule)},
    {path: 'location', component: TruckLocationComponent},
    { path: '500', component: InternalServerComponent },
    { path: '', redirectTo: '/home', pathMatch: 'full' }
  ];
...

我还创建了一个 Truck.guard.ts 文件来管理卡车模块的路线:

export cl TruckGuard implements CanActivate, CanActivateChild {
  constructor(private authService: AuthService, private route: Router) {}
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    let url = window.location.pathname;
    if((url == '/truck') && this.authService.isCustomer()){
      return true;
    }
    else{
      this.route.navigate(['app-forbidden']);
      return false;
    }
  }
 
  canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    let url = window.location.pathname;
    if((url == '/truck/list') && this.authService.isCustomer()){
      return true;
    }
    else if((url == '/truck/search') && this.authService.isCustomer()){
      return true;
    }
    else if((url == '/Login') && this.authService.isCustomer()){
      return true;
    }
    else{
      this.route.navigate(['app-forbidden']);
      return false;
    }
  }
}

唯一有效的路径是truck/list。他被重定向到 forbbiden 页面。

所有其他人都不起作用。

我不明白为什么。我如何使用 canActivate 和 canActivateChild。

提前感谢你的帮助。

1

你做错了几件事。

卡车 / 列表工作的原因是因为您正在应用 canActivate 而不是这里的其余部分

 {path: 'list', component: TruckListComponent, canActivate: [TruckGuard]},

在你的 canActivate 中,你只在这里迎合卡车 / 列表

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url = window.location.pathname;
if((url == '/truck') && this.authService.isCustomer()){
  return true;
}
else{
  this.route.navigate(['app-forbidden']);
  return false;
}

}

其他人不工作的原因是因为您没有将 canActivateChild 应用于父模块。

像这样将 canActivateChild 添加到 appRoute

const appRoutes: Routes = [
{ path: '', component: HomeComponent},
{ path: 'app-forbidden', component: ForbiddenComponent},
{ path: 'Home', component: HomeComponent},
{ path: 'About', component: AboutComponent},
{ path: 'forbidden', component: ForbiddenComponent},
{ path: 'Login', component: LoginComponent},
{ path: 'Logout', component: LoginComponent},
{ path: 'confirmation-commande/:message', component: ConfirmationCommandeComponent},
{ path: 'orders', component: OrderListComponent},
{ path: 'truck/search', component: TruckSearchComponent},
{ path: 'SignUp/customer', component: UseraccountCreateCustomerComponent},
{ path: 'SignUp/truck', component: UseraccountCreateTruckComponent},
{ path: 'useraccount', loadChildren: () => 
import('./useraccount/useraccount.module').then(u => u.UserAccountModule)},
// Truck module Your canActivateChild comes here    
{ path: 'truck', loadChildren: () => import('./truck/truck.module').then(t=> t.TruckModule)}, canActivateChild:TruckGuard // <<< HERE
{path: 'location', component: TruckLocationComponent},
{ path: '500', component: InternalServerComponent },
{ path: '', redirectTo: '/home', pathMatch: 'full' }

];

0

最后,解决方案是在 app-module.ts 中添加 canActivateChild:

 { path: 'truck', loadChildren: () => import('./truck/truck.module').then(t => t.TruckModule), canActivateChild: [TruckGuard]},

并使用state: RouterStateSnapshot代替window.location.pathname测试保护文件中的 URL,如下所示:

 if((state.url == '/truck/list') && this.authService.isCustomer()){
      return true;
    }
    else if((state.url == '/truck/search') && this.authService.isCustomer()){
      return true;
    }
   else if((state.url == '/truck/menu') && this.authService.isCustomer()){
      return true;
    }
    else if((state.url == '/truck/menu/' + childRoute.params['id']) && this.authService.isCustomer()){
      return true;
    }
    else if((state.url == '/truck/details/' + childRoute.params['id']) && this.authService.isCustomer()){
      return true;
    }
    else if((state.url == '/Login') && this.authService.isCustomer()){
      return true;
    }
    else{
      this.route.navigate(['app-forbidden']);
      return false;
    }

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(957)
基于asp的毕业设计:asp:基于条件的RequiredFieldValidator验证
上一篇
Op jj:在JS或jQuery中将格式日期 jj-mm-aaaa更改为jj/mm/aaaa
下一篇

相关推荐

  • cookies成员:如何使用Cookies来提升网站的用户体验

    Cookies 是一种存储在客户端的小型文本文件,用于跟踪客户端状态。它们可以用来记录用户的登录信息,浏览器历史记录,购物车内容等等。…

    2023-02-08 05:05:54
    0 17 64
  • css预处理器有哪些Sass、Less 和 Stylus

    CSS预处理器是一种用于构建CSS的工具,它可以帮助开发人员更轻松、更有效地创建和维护CSS代码。它们使用特殊的语法,可以添加变量、函数、继承和混合等功能,以帮助开发人员更轻松地编写CSS。…

    2023-02-21 16:05:18
    0 34 96
  • cookie欺骗:如何使用Cookie来欺骗网站?

    Cookie欺骗是一种网络攻击,它利用了Web服务器对用户cookie的信任,使攻击者可以获得未经授权的访问权限。Cookie欺骗攻击通常发生在用户尝试登录网站时,攻击者会拦截用户的请求,并将其自己的cookie植入用户的请求中,这样服务器就会把攻击者的cookie当作用户的cookie,从而使攻击者获得未经授权的访问权限。…

    2023-03-20 16:18:48
    0 89 20
  • http://dvd点81vvv点com/最新最全的DVD资源网站

    示例示例http://dvd点81vvv点com/ 是一个域名,它可以指向一个特定的网站或者服务器。要访问这个域名,可以使用以下代码:…

    2023-02-18 00:53:23
    0 36 38
  • Pis系统:用静态ip地址连接两个覆盆子pis(how to setup static ip on raspberry pi)

    关于Pis系统的问题,在how to setup static ip on raspberry pi中经常遇到,我想通过网络电缆连接两个 Raspberry Pis,以便将命令从一个 Pi 发送到另一个。为此,我想在两个 Pis 上设置一个静态 IP地址。我知道我将不得不编辑dhcpcd.conf-文件。…

    2022-11-23 08:53:12
    0 66 96
  • web服务与restful技术:使用RESTful API实现Web服务

    Web服务是一种软件系统,它可以通过网络与其他软件系统进行交互。它使用轻量级的、可扩展的协议,如HTTP,XML,JSON等,来支持远程服务调用和数据交换。…

    2023-02-17 15:20:28
    0 46 15
  • python安装urllib2:如何使用urllib2在Python中发送HTTP请求

    示例示例Python安装urllib2的方法:使用pip安装:…

    2023-02-10 15:57:27
    0 68 90
  • pinterest网页版在Pinterest上发现新的创意

    Pinterest网页版是一种社交媒体平台,它允许用户分享图片,视频,文章和其他内容。用户可以在Pinterest上创建自己的主页,收集和发布内容,并与其他用户进行交流。…

    2023-02-04 08:04:12
    0 53 26

发表评论

登录 后才能评论

评论列表(33条)