如果用户未登录,如何重定向到登录页面?

时间:2018-10-19 06:02:57

标签: angular angular6 angular-routing angular-guards

我已经实现了登录前和登录后的保护,以便某些用户无法访问所有页面。我的问题是,当用户未登录时&尝试输入未经授权的页面(例如“ localhost:4200 / restricted_pa​​ge”)时,应将其重定向到登录页面“ 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 :(得分: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种方法。

答案 1 :(得分: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;
    }

}

答案 2 :(得分:0)

使用public void setSpeciality(String spec) { if(specialities.stream().anyMatch(s-> s.equalsIgnoreCase(spec))) { speciality =spec.toLowerCase(); speciality = String.valueOf((speciality.charAt(0)).toUpperCase()) + speciality.substring(1) ; } else { speciality = "General Practitioner"; } } 的{​​{1}}导航,或仅在路线声明中使用@angular/router