当前位置:  开发笔记 > 前端 > 正文

Angular2 CanActivate导航

如何解决《Angular2CanActivate导航》经验,为你挑选了1个好方法。

我有以下问题。我制作了一个CanActivate Guard,可以在其中登录到“债务”组件。我的问题是,当我登录后,我想将用户重定向到债务组件(因为RegistrationComponent是默认组件),但是却无法正常工作(实际上我的页面正在阻塞。而且我无法执行任何操作)。我的CanActivate函数

export class AuthGuardService implements CanActivate {

constructor(private router: Router) { }

canActivate(): Promise{
    return checkIfAuth().then(() => {
        setLoggedIn(true);
        this.router.navigate(['/debts']); // <- broken :(
        return true;
    }).catch(() => {
        setLoggedIn(false);
        this.router.navigate(['/login']); // <- broken :(
        return false;
    })
  }
}


export function checkIfAuth () {
return new Promise((resolve, reject) => {
    firebase.auth().onAuthStateChanged((user) => {
        if(user){
            return resolve(true);
        }
        else{
            return reject(false);
        }
    })
  })
}

任何我的应用程序路由

const APP_ROUTES: Routes = [
    { path: '', redirectTo: '/registration', pathMatch: 'full' },
    {  path: 'registration', component: RegistrationComponent },
    { path: 'login', component: LoginComponent },
    { path: 'myaccount', component: AccountComponent, canActivate: [AuthGuardService]},
    { path: 'debts', component: DebtsComponent, canActivate: [AuthGuardService]}
];

Alex Beugnet.. 5

我所做的虽然有点骇人听闻,但却可以完美地工作:

首先,我确实GuardLoginCompoment路线上设置了一个。

{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }

然后,我使用RouterStateSnapshot来获取我的URL状态的单个实例,指示我用户想要访问的内容。

然后,我可以在Guard中管理案件:

import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

...

/**
 *  Protects the routes to reach with authentication
 */
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    // Set user authentication state depending on the token's existance
    this.authService.setLoggedInState();
    // Check user authentication state
    if (this.authService.isAuthenticated) {
      // Explicit navigation to '/login' while the user is already authenticated
      if (state.url === '/login') {
        this.router.navigate(['/dashboard']); // Debts for you
      }
      return true;
    } else {
      // Allow route to './login' to get authenticated
      if (state.url === '/login') {
        return true;
      }
      // Explicit navigation to any URL while not being authenticated
      this.router.navigate(['/login']);
      return false;
    }
  }

有关快照的文档链接:https : //angular.io/docs/ts/latest/guide/router.html#!# sts = Snapshot:% 20the% 20no-observable% 20alternative

为了使它适合您的情况,您只需要setLoggedInState()使它适应似乎已经存在的情况即可。

注意:我将此解决方案称为HACK,因为您实际上在设置防护措施的Login同时,即使用户未经过身份验证,防护措施仍将允许用户访问它。仍然运作良好。



1> Alex Beugnet..:

我所做的虽然有点骇人听闻,但却可以完美地工作:

首先,我确实GuardLoginCompoment路线上设置了一个。

{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }

然后,我使用RouterStateSnapshot来获取我的URL状态的单个实例,指示我用户想要访问的内容。

然后,我可以在Guard中管理案件:

import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

...

/**
 *  Protects the routes to reach with authentication
 */
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    // Set user authentication state depending on the token's existance
    this.authService.setLoggedInState();
    // Check user authentication state
    if (this.authService.isAuthenticated) {
      // Explicit navigation to '/login' while the user is already authenticated
      if (state.url === '/login') {
        this.router.navigate(['/dashboard']); // Debts for you
      }
      return true;
    } else {
      // Allow route to './login' to get authenticated
      if (state.url === '/login') {
        return true;
      }
      // Explicit navigation to any URL while not being authenticated
      this.router.navigate(['/login']);
      return false;
    }
  }

有关快照的文档链接:https : //angular.io/docs/ts/latest/guide/router.html#!# sts = Snapshot:% 20the% 20no-observable% 20alternative

为了使它适合您的情况,您只需要setLoggedInState()使它适应似乎已经存在的情况即可。

注意:我将此解决方案称为HACK,因为您实际上在设置防护措施的Login同时,即使用户未经过身份验证,防护措施仍将允许用户访问它。仍然运作良好。

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