配置 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
方法通过了当前 ActivatedRouteSnapshot
和 RouterStateSnapshot
。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
this.requireLeages = route.params... // something from route
}
这是 ActivatedRouteSnapshot 的 docs。它有很多有用的属性,包括 data
属性,您可以使用它来存储自己的数据以在路由和服务之间共享。
有什么方法可以配置 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
方法通过了当前 ActivatedRouteSnapshot
和 RouterStateSnapshot
。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
this.requireLeages = route.params... // something from route
}
这是 ActivatedRouteSnapshot 的 docs。它有很多有用的属性,包括 data
属性,您可以使用它来存储自己的数据以在路由和服务之间共享。