Angular 2执行登录验证(我进入无限循环。)

时间:2017-04-25 05:27:31

标签: javascript angular typescript angular2-routing

我正在尝试创建一个网站后端,我需要Angular 2中的用户身份验证。但是我无法解决一些问题,这就是我正在做的事情。

这是我的路由文件。

const appRoutes: Routes = [
 {
   path: 'admin',
   component: AdminloginComponent,
   canActivate: [LoggedInGuard]
 },
 {
   path: '',
   component: HomepageComponent
 },
 {
   path: '**',
   component: OurservicesComponent
 },
];

这是我的gaurd文件://成功登录后,我在本地存储中设置了is_logged_in。

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
@Injectable()
export class LoggedInGuard implements CanActivate {
 constructor(private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  if(localStorage.getItem("is_logged_in"))
  {
      this.router.navigate(['/admin/dashboard']);
      return true;
  }
  return false;
}

}

**我的问题是,当网址为/ admin时,canActivate会生效,如果我获得本地存储,我将导航到管理员/信息中心。

但是如果用户注销,那么在这种情况下/ admin应该是loginform,但是如果我导航到/ admin如果没有登录则会进入canActivate并再次将它们放在本地存储中,所以它会转到admin等等。那么解决这个问题的正确方法是什么。

提前致谢。

1 个答案:

答案 0 :(得分:1)

目前还不清楚您要尝试完成的内容,但使用router.navigate进行重定向应与return false;一起使用,而不是return true;

无论

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if(localStorage.getItem("is_logged_in")) {
      return true;
    }
    this.router.navigate(['/admin/dashboard']);
    return false;
  }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if(localStorage.getItem("is_logged_in")) {
      this.router.navigate(['/admin/dashboard']);
      return false;
    }
    return true;
  }