Как перенаправить на страницу входа, если пользователь не вошел в систему? - PullRequest
0 голосов
/ 19 октября 2018

Я реализовал защиту перед входом и после входа в систему, чтобы некоторые пользователи не могли получить доступ ко всем страницам.Мой вопрос: когда пользователь не вошел в систему и когда он пытается зайти на неавторизованную страницу, такую ​​как «localhost: 4200 / limited_page», он должен быть перенаправлен на страницу входа «localhost: 4200 / login».Но я не могу перенаправить на страницу входа.Теперь он перенаправляет только на localhost: только 4200.

Где мне исправить код?

before-login.guard

export class BeforeLoginGuard implements CanActivate {
    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

        return !this._tokenService.loggedIn();

    }

    constructor(private _tokenService: TokenService) { }
}

after-login.guard

export class AfterLoginGuard implements CanActivate {

    constructor(private _tokenService: TokenService) { }

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

        return this._tokenService.loggedIn();
    }
}

token.service

export class TokenService {
    payload(token) {
        const payload = token.split('.')[1];
        //decoding 
        if (typeof (payload) !== 'undefined')
            return JSON.parse(atob(payload));
        return false;
    }

    loggedIn() {
        // return this.isValid();
        const token = this.getToken();
        console.log("token", token);
        if (token) {
            const payload = this.payload(token);
            if (payload) {
                return Object.values(this.iss).indexOf(payload.iss) > -1 ? true : false;
            }
        }
        return false;
    }
}

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Я полагаю localhost:4200/restricted_page - этот маршрут будет иметь AfterLoginGuard .

Так что в этом компоненте

   canActivate( next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
       let flag = this._tokenService.loggedIn();
       if(flag ){
          return flag ;
       } else {
          // Navigate to login component. You will have to add router to constructor 
             and then this.router.navigate(['/login']);
          return;
       }
       return flag;
    }

В идеале я считаю, что должен быть только один Auth gaurdс разными условиями.Но в любом случае вы разработали 2 выше будет работать для вас.

0 голосов
/ 19 октября 2018

Навигация по методу canActivate в зависимости от статуса входа в систему:

constructor(private router: Router,
            private _tokenService: TokenService) {

}

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    if(this._tokenService.loggedIn()) {
        return true;
    } else {
        this.router.nvigate['/login']; <=== navigate wherever you want
        return false;
    }

}
0 голосов
/ 19 октября 2018

используйте @angular/router на this.router.navigate([ '/login']) или просто используйте redirectTo в объявлении маршрута

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...