【问题标题】:Angular guards not working in the routing of pagesAngular 防护在页面路由中不起作用
【发布时间】:2019-07-03 01:34:31
【问题描述】:

我正在登录一个应用程序,我已经为登录之后和之前的页面路由创建了 2 个守卫。我在 CanActivate 中调用的方法正是我想要的。 true 如果access_token 存在,false 如果不存在。问题是即使我已登录,我也不会被重定向到我想要的页面。

这是我得到的错误:

ERROR 错误:未捕获(承诺中):错误:CanActivate 保护无效 错误:CanActivate 保护无效

在登录之前注意之后发生的事情:

import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router/src/utils/preactivation';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { TokenService } from './token.service';

@Injectable({
  providedIn: 'root'
})
export class BeforeLoginService implements CanActivate {
  path: ActivatedRouteSnapshot[];
  route: ActivatedRouteSnapshot;


  CanActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    console.log(this.Token.loggedIn());
    return this.Token.loggedIn();
  }

  constructor(private Token: TokenService) { }
}

注意登录后发生的事情:

import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router/src/utils/preactivation';
import { TokenService } from './token.service';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AfterLoginService implements CanActivate {
  path: ActivatedRouteSnapshot[];
  route: ActivatedRouteSnapshot;


  CanActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    console.log(this.Token.loggedIn());
    return !this.Token.loggedIn();
  }

  constructor(private Token: TokenService) { }
}

我这部分业务的路由模块:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { UserBaseComponent } from './users/components/user-base/user-base.component';
import { StaffBaseComponent } from './staffs/components/staff-base/staff-base.component';
import { IndexComponent } from './index/index.component';
import { LoginComponent } from '../core/components/login/login.component';
import { AfterLoginService } from '../core/services/after-login.service';
import { BeforeLoginService} from '../core/services/before-login.service';

const routes: Routes = [
  {
    path: 'administration',
    component: IndexComponent,
    children: [
      {path: 'users', component: UserBaseComponent, canActivate: [AfterLoginService]},
      {path: 'staffs', component: StaffBaseComponent, canActivate: [AfterLoginService]}
    ],
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AdminRoutingModule { }

而且我已经确保提供程序中包含守卫。

【问题讨论】:

  • this.Token.loggedIn() 返回什么?
  • 如果访问令牌(顺便说一句,JWT)存在则为真,如果不存在则为假
  • 您可以尝试直接从@angular/router 导入CanActivate 而不是@angular/router/src/utils/preactivation 吗? import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
  • 加上@AlexanderStaroselsky 的回答:“canImplement”方法应该小写(canActivate,而不是 CanActivate)。
  • 真的!我的错。不过,我没有收到错误消息,但我仍在访问需要登录令牌才能查看的页面

标签: angular jwt angular-router-guards


【解决方案1】:

你有几个错误是正确的

  1. 正确的导入语句

    import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
    
  2. 还要更改canActivate中的大小写

  3. 要重定向到/login 页面,您必须使用router 导航方法手动重定向到/login 页面。重定向不会自动发生。

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
       const isLogin = this.Token.loggedIn();
       if (!isLogin) this.router.navigate(['/login']) 
       return isLogin;
    }
    

【讨论】:

  • 你是对的。非常感谢。我现在可以问一下,我应该只使用 1 名守卫在登录前后的页面之间重定向吗?
  • 我没听明白,你能详细说明一下吗?
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多