配置 Angular 路由器防护

Configure Angular router guard

有什么方法可以配置 Angular 路由器中使用的 canActivate 守卫?

有这个SessionGuard:

@Injectable()
export class SessionGuard implements CanActivate {

    public requireLeagues: boolean = true;

    constructor(private authService: AuthService, private session: SessionService, private router: Router) {
    }


    async canActivate(): Promise<boolean> {
        if (!this.authService.isLoggedIn) {
            return false;
        }

        await this.session.start();

        if (this.requireLeagues && (!this.session.leagues || this.session.leagues.length == 0)) {
            //Redirect to create league page
            this.router.navigate(['/create-league']);

            return false;
        } else {
            return true;
        }
    }
}

这条路线:

const routes: Routes = [
    {path: '', component: HomeComponent, canActivate: [AuthGuard, SessionGuard]},// <-- requireLeagues = false
    {path: 'login', component: LoginComponent},
    {path: 'leagues', component: [AuthGuard, SessionGuard]},
];
@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule {
}

我想根据路由将 requireLeagues 设置为 true 或 false,而不必创建一个新的、不同的守卫。这可能吗?

是的,canActivate 方法通过了当前 ActivatedRouteSnapshotRouterStateSnapshot

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
   this.requireLeages = route.params... // something from route
}

这是 ActivatedRouteSnapshot 的 docs。它有很多有用的属性,包括 data 属性,您可以使用它来存储自己的数据以在路由和服务之间共享。