Angular 角度路线守卫:或与和

Angular 角度路线守卫:或与和,angular,typescript,angular-routing,roles,angular-route-guards,Angular,Typescript,Angular Routing,Roles,Angular Route Guards,我正在使用route guards保护我的Angular应用程序的前端。在过去与他们合作和在线研究时,向一条路线添加多个守卫需要所有守卫返回true以允许访问 但如果我只希望其中一个返回true以允许访问呢?(像| |而不是&) 例如,我的路由守卫在用户的令牌中查找某些角色: @Injectable() export class ActiveRoleGuard implements CanActivate { constructor(private sessionService: Ses

我正在使用route guards保护我的Angular应用程序的前端。在过去与他们合作和在线研究时,向一条路线添加多个守卫需要所有守卫返回true以允许访问

但如果我只希望其中一个返回true以允许访问呢?(像| |而不是&)

例如,我的路由守卫在用户的令牌中查找某些角色:

@Injectable()
export class ActiveRoleGuard implements CanActivate {
    constructor(private sessionService: SessionService, private router: Router) { }


    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        let token = this.sessionService.getToken();

        if (!token) {
             return false;
        }

        if (token.role.toLowerCase().indexOf("active") < 0) {
            this.router.navigate(["/issue"]);
            return false;
        }

        return true;
    }
}

但是如何在Angular中做到这一点呢?

您可以使用一个可以“配置”的单一版本,而不是使用两个单独的
激活
实现。为此,您可以利用的
data
属性。例如,在路线中,您可以执行以下操作:

{
    path: "someroute",
    component: SomeComponent,
    canActivate: [RoleRouteGuard],
    data: {
        requiredRoles: ["Role1", "Role2", "Role3"]
    }
}
使用此功能,您可以使用现有的
CanActivate
实现之一,并使其更通用。您可以通过
ActivatedRouteSnapshot
data
访问
requiredRoles
属性。e、 g:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    const requiredRoles = route.data.requiredRoles;
    ....
一旦你得到了这个,你可以检查令牌的角色是否在数组中,等等


如果您有一个始终必需的
活动的
角色,然后是
管理员
经理
角色,您还可以将其扩展为具有多个
数据
属性。例如,您可以拥有
所需的角色
至少一个角色
,并更新您的逻辑以相应地处理这些角色。。。目前有很多选择,但我认为您不需要帮助。

您可以使用一个单独的防护装置来管理这两种情况,即使它没有那么干净,我还没有看到任何其他解决方案。。。这就是说,对于一个管理员来说,没有一些令牌检查似乎很奇怪。您可以通过在您的令牌中添加一个
admin
角色来解决这个问题。我不希望合并,因为目前有6个角色具有重叠的权限。但是,如果Angular还不支持这一点,那么这就是我最好的创造性解决方案,我不喜欢在不同的位置传递如此多的字符串文本,以防这些角色更改或重命名。否则,这是一个有趣的解决方案。@NathanFoss您可以在这种情况下使用枚举。
{
    path: "someroute",
    component: SomeComponent,
    canActivate: [RoleRouteGuard],
    data: {
        requiredRoles: ["Role1", "Role2", "Role3"]
    }
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    const requiredRoles = route.data.requiredRoles;
    ....