3

我正在使用路由保护来保护我的 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;
    }
}

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


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

        if (!token) {
            return false;
        }

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

        return true;
    }
}

如果我要将它们正常组合在路由器模块中,它将类似于...

{path: "someroute", component: SomeComponent, canActivate: [ActiveRouteGuard, AdminRouteGuard]}

...但这将要求用户既是Active又是Admin. 但是,如果我想强制执行 beingActive和ana怎么办?Admin Manager

像这样在 API 上强制执行很简单

[Authorize(Roles = "Active")]
[Authorize(Roles = "Admin, Manager")]
public class SomeController : ApiController

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

4

1 回答 1

7

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

{
    path: "someroute",
    component: SomeComponent,
    canActivate: [RoleRouteGuard],
    data: {
        requiredRoles: ["Role1", "Role2", "Role3"]
    }
}

使用它,您可以采用现有CanActivate实现之一,并使其更通用。您可以通过 访问该requiredRoles属性。例如:dataActivatedRouteSnapshot

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    const requiredRoles = route.data.requiredRoles;
    ....

一旦你有了这个,你可以检查令牌的角色是否在数组中,等等。

如果您有一个始终需要的Active角色,然后是一个AdminManager角色,您还可以将其扩展为具有多个data属性。例如,您可以拥有requiredRolesatLeastOneOfRoles更新您的逻辑以相应地处理它......此时有很多选择,但我认为您不需要帮助。

于 2017-09-05T20:59:20.993 回答