Як застосувати canActivate охорону на всіх маршрутах?


79

У мене є активний охоронець angular2, який обробляє, якщо користувач не ввійшов у систему, перенаправіть його на сторінку входу:

import { Injectable } from  "@angular/core";
import { CanActivate , ActivatedRouteSnapshot, RouterStateSnapshot, Router} from "@angular/router";
import {Observable} from "rxjs";
import {TokenService} from "./token.service";

@Injectable()
export class AuthenticationGuard implements CanActivate {

    constructor (
        private router : Router,
        private token : TokenService
    ) { }

    /**
     * Check if the user is logged in before calling http
     *
     * @param route
     * @param state
     * @returns {boolean}
     */
    canActivate (
        route : ActivatedRouteSnapshot,
        state : RouterStateSnapshot
    ): Observable<boolean> | Promise<boolean> | boolean {
        if(this.token.isLoggedIn()){
            return true;
        }
        this.router.navigate(['/login'],{ queryParams: { returnUrl: state.url }});
        return;
    }
}

Я повинен реалізувати це на кожному маршруті, як:

const routes: Routes = [
    { path : '', component: UsersListComponent, canActivate:[AuthenticationGuard] },
    { path : 'add', component : AddComponent, canActivate:[AuthenticationGuard]},
    { path : ':id', component: UserShowComponent },
    { path : 'delete/:id', component : DeleteComponent, canActivate:[AuthenticationGuard] },
    { path : 'ban/:id', component : BanComponent, canActivate:[AuthenticationGuard] },
    { path : 'edit/:id', component : EditComponent, canActivate:[AuthenticationGuard] }
];

Чи є кращий спосіб реалізувати параметр canActive без додавання його до кожного шляху.

Я хочу додати його на основний маршрут, і це повинно стосуватися всіх інших маршрутів. Я багато шукав, але не міг знайти жодного корисного рішення

Дякую

Відповіді:


179

Ви можете ввести безкомпонентний батьківський маршрут і застосувати там захист:

const routes: Routes = [
    {path: '', canActivate:[AuthenticationGuard], children: [
      { path : '', component: UsersListComponent },
      { path : 'add', component : AddComponent},
      { path : ':id', component: UserShowComponent },
      { path : 'delete/:id', component : DeleteComponent },
      { path : 'ban/:id', component : BanComponent },
      { path : 'edit/:id', component : EditComponent }
    ]}
];

Радий почути :) Дякую за відгук.
Günter Zöchbauer

11
@ GünterZöchbauer Я завжди читаю ваші поради. Дуже дякую!! Але в моєму випадку це не працює. CanActive не працює при маршрутизації між дітьми. Я використовую canActivateChild. Це працює.
Сміранін

Радий почути, що ви знайдете мої відповіді корисними :) і дякую за згадку про canActivateChild
Günter Zöchbauer

3
Я не впевнений. Можна спробувати canActivateChildзамість canActivate. Я ще не використовував цього.
Гюнтер Цохбауер,

2
Так, canActivateChildце кращий підхід для даного сценарію охопити всі дочірні маршрути. А сам батько може охороняти використання canActivateабо canLoadзалежно від того, коли його завантажено в програму. Крім того, фрагмент коду видасть помилки консолі у версії 6.0, оскільки Angular очікує оголошення компонента або дочірнього елемента в конфігурації маршруту.
ashish.gd

13

Ви також можете підписатися на зміни маршруту маршрутизатора у функції ngOnInit вашого app.component і перевірити автентифікацію звідти, наприклад

    this.router.events.subscribe(event => {
        if (event instanceof NavigationStart && !this.token.isLoggedIn()) {
            this.router.navigate(['/login'],{ queryParams: { returnUrl: state.url}}); 
        }
    });

Мені більше подобається такий спосіб перевірки будь-якого додатка, коли маршрут змінюється.


як отримати state.urlтакий підхід?
c.sankhala

3

Я думаю, вам слід реалізувати "дочірню маршрутизацію", яка дозволить вам мати батьків (із шляхом "адміністратор", наприклад) та його дочірніх дітей.

Тоді ви можете застосувати до батьків активізацію, яка автоматично обмежить доступ до всієї його дитини. Наприклад, якщо я хочу отримати доступ до "admin / home", мені потрібно буде пройти через "admin", який захищений canActivate. Ви навіть можете визначити батьків із порожнім шляхом "", якщо хочете

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.