当前位置:  开发笔记 > 编程语言 > 正文

Angular2:使用AuthGuard路由重定向

如何解决《Angular2:使用AuthGuard路由重定向》经验,为你挑选了1个好方法。

我有一个Angular2应用程序,如果用户没有登录,应该阻止到某个页面的路由.这是我的app.routes文件

export const routes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'login', component: LoginComponent },
  { path: 'home', component: HomeComponent, canActivate: [AuthGuard] },
  { path: '**', component: LoginComponent },
];

和我的AuthGuard文件

@Injectable()
export class AuthGuard implements CanActivate {
response: ResponseInterface;

constructor(private router: Router, private localStorage: LocalStorageService,
 private services: MyService) { }
canActivate() {

let token = String(this.localStorage.get('token'));
if (token != null) {
  this.services.keepAlive(token).subscribe(
    response => this.response = response,
    error => alert(error),
    () => {
      if (this.response.status == 'OK') {
        console.log("response OK");
        return true;
      } else {
        console.log("response KO");
        this.router.navigate(['/login']);
        return false;
      }
    }
  )

} else {
  this.router.navigate(['/login']);
  return false;
}

现在,如果我尝试导航到http:// localhost:4200 /#/ home路径并且我已经将令牌存储到localStorage中,则不会发生任何事情:主页未显示且导航栏上的路径变为http:// localhost: 4200 /#/.怎么了?



1> Seid Mehmedo..:

canActive方法应返回Observable,Promiseboolean.

您正在订阅this.services.keepAliveObservable,并将boolean值返回到subscribe回调,而不是将其返回给canActivate方法.更改您的代码如下:

canActivate(): Observable | Promise | boolean {
    let token = String(this.localStorage.get('token'));
    if (token != null) {
        return this.services.keepAlive(token)
            .map(response => {
                if (response.status == 'OK') {
                    console.log("response OK");
                    return true;
                } else {
                    console.log("response KO");
                    this.router.navigate(['login']);
                    return false;
                }
            });
    } else {
        this.router.navigate(['login']);
        return false;
    }
}

这样,布尔类型(Observable)的Observable 将返回给canActive方法,并且路由解析应该按预期工作.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有