Определение охраны маршрута
Существует два способа определения охраны.Более простой способ заключается в создании функции, как показано ниже:
// file app.routing.ts
const appRoutes: Routes = [
{path: "", redirectTo: "board", pathMatch: "full"},
{path: "board", component: BoardComponent, canActivate: ["boardGuard"]}
];
export const routingProviders = [
{provide: "boardGuard", useValue: boardGuard}
];
export function boardGuard(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return true;
}
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
// file app.module.ts
import {routing, routingProviders} from "./app.routing";
@NgModule({
import: [routing],
providers: [routingProviders]
})
export class AppComponent {}
Вы также можете использовать внедрение зависимостей в функции защиты, например:
export const tpRoutingProviders = [
{provide: "authenticatedGuard", useFactory: (authService: AuthService) => {
return () => authService.isUserAuthenticated();
},
deps: [AuthService]
}
];
Второй параметр:определить класс, который реализует интерфейс Can Activate.Следуйте этому:
// file app.routing.ts
const appRoutes: Routes = [
{path: "worksheet", component: WorksheetComponent, canActivate: [WorksheetAccessGuard]}
];
// file ActivationGuards.ts
@Injectable()
export class WorksheetAccessGuard implements CanActivate {
private static USER_PARAM = "userId";
constructor(private router: Router, private userService: CurrentUserService) {}
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const currentUser = this.userService.currentUser;
const paramUser = route.params[WorksheetAccessGuard.USER_PARAM];
if (paramUser && paramUser !== currentUser.id && !currentUser.admin) {
this.router.navigate(["worksheet"]);
return false;
}
return true;
}
}
// file app.module.ts
@NgModule({
providers: [WorksheetAccessGuard]
})
export class AppComponent {}