1

我已经实现了登录前和登录后保护,以便某些用户无法访问所有页面。我的问题是,当用户未登录时,当他们尝试进入未经授权的页面时,例如“localhost:4200/restricted_pa​​ge”,它应该被重定向到登录页面“localhost:4200/login”。但我无法重定向到登录页面。现在它只重定向到 localhost:4200 。

我应该在哪里修复代码?

登录前.guard

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

        return !this._tokenService.loggedIn();

    }

    constructor(private _tokenService: TokenService) { }
}

登录后守卫

export class AfterLoginGuard implements CanActivate {

    constructor(private _tokenService: TokenService) { }

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

        return this._tokenService.loggedIn();
    }
}

令牌服务

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;
    }
}
4

3 回答 3

1

我相信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 对你有用。

于 2018-10-19T06:30:40.283 回答
1

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;
    }

}
于 2018-10-19T06:33:51.337 回答
0

@angular/router使用by导航this.router.navigate([ '/login'])或仅redirectTo在您的路线声明中使用

于 2018-10-19T06:24:52.237 回答