Javascript 角度5多条件路由:";AuthGuards";

Javascript 角度5多条件路由:";AuthGuards";,javascript,angular,typescript,Javascript,Angular,Typescript,我正在尝试在angular 5中创建条件路由,我已经看到了这篇文章和angular的官方里程碑页面: . 但是我没有找到一种基于输入变量创建多个条件的方法。 这是我的密码: import { Injectable } from '@angular/core'; import {CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot} from '@angular/router'; import {AuthServiceS

我正在尝试在angular 5中创建条件路由,我已经看到了这篇文章和angular的官方里程碑页面: .

但是我没有找到一种基于输入变量创建多个条件的方法。 这是我的密码:

import { Injectable } from '@angular/core';
import {CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot} from '@angular/router';
import {AuthServiceService} from './auth-service.service';
@Injectable()
export class AuthguardService  implements CanActivate{

    constructor(
        private router: Router,
        private AuthService:AuthServiceService
    ) {}

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        if(this.AuthService.ValidAs("User")!=true){
            this.router.navigate(['pages/login']);
            return false;
        }else{
          return true;
        }
    }

}
我的
AuthService.ValidAs()
方法使用一个参数来确定要尝试并验证为访问路由合法的用户类型,并返回一个布尔值。我有三种类型的用户,如何将额外参数传递给路由中的
canActivate
属性,以便将其用作
ValidAs
方法的参数

如果有任何其他方法可以创建多个
can激活
实例而不增加文件,请告诉我。

您有两个选择

首先是使用
params
queryParams

canActivate(
  route: ActivatedRouteSnapshot, 
  state: RouterStateSnapshot): boolean {
  const userType = router.paramMap.get('userType');
}
其次是使用依赖项注入

constructor(
  private router: Router,
  private AuthService: AuthServiceService,
  @Inject(CURRENT_USER) user: User,
) {}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
  const userType = this.user.type;
}

您可以将
数据
对象传递到如下任何路由:

...
{
   path:'dashboard',
   component:DashboardComponent,
   canActivate:[
      AuthGuard
   ],
   data:{
      roles: ['ROLE_ADMIN', 'ROLE_EDITOR', 'OTHER_ROLE'],
      // any other relevant data to make your checks
   }
},
...
然后在AuthGuard中,您可以检索以下数据:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    ...
    const roles = route.data[ 'roles' ] as Array<string>;

    // Do other checks here
    ...
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值{
...
const roles=route.data['roles']作为数组;
//在这里做其他检查
...
}

如果我使用queryparams,这意味着用户将在url中看到他的用户类型,并且可能会篡改验证结果。如果我使用第二种方法,即cna我存储的UserVariable,我正在注入?你能再解释一下第二种解决方案吗