【问题标题】:redirectTo lazy module based on user role重定向到基于用户角色的惰性模块
【发布时间】:2019-08-05 10:54:50
【问题描述】:

在我的 Angular 8 应用程序中,我有 3 个延迟加载模块。每个模块都针对特定用户的角色。我正在使用 canActivate 接口进行身份验证和角色保护。
对于以下路线

{ path : '' , pathMatch : 'full' , redirectTo : ''}

我应该如何使用 redirectTo 属性,所以它会根据用户角色重定向到延迟加载的路由。 这是路由模块的代码。

app.routing.module.ts

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

const routes: Routes = [
  { path : '' , pathMatch: 'full' , redirectTo : ''},  
  { path : 'admin'  , loadChildren : () => import('./modules/admin/admin.module').then(mod => mod.AdminModule) , canActivate : [AuthGuardService] , data : { role : 'admin'}} ,
  { path : 'member' , loadChildren : () => import('./modules/member/member.module').then(mod => mod.MemberModule) , canActivate : [AuthGuardService] ,   data : { role : 'member'}} ,
  { path : 'user'   , loadChildren : () => import('./modules/user/user.module').then(mod => mod.UserModule) , canActivate : [AuthGuardService] , data : { role : 'user'}} ,

  { path : '**' , component : NotFoundComponent }
];
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

AuthGuardService.ts

import { Injectable } from '@angular/core';
import { Router , CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from '../auth-service/auth-service.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuardService implements CanActivate {
  constructor(
      private router: Router,
      private authService: AuthService
  ) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean> | Promise<boolean> | boolean {
    const currentUser = this.authService.userVal;
    const role       = route.data.role;
    if (currentUser) {      
      if(role && role.indexOf(currentUser.role) > -1)
        return true;          
      else 
        return false;          
    }
    return false;
  }
}

【问题讨论】:

标签: typescript routing lazy-loading angular8


【解决方案1】:

再次感谢@DeborahK。在经历了这个Github Disucssion之后,这是可行的解决方法。

app.routing.module.ts

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

const routes: Routes = [
  { path : '' , pathMatch: 'full' , redirectTo : '' , canActivate : [RedirectGuardService]},  
  { path : 'admin'  , loadChildren : () => import('./modules/admin/admin.module').then(mod => mod.AdminModule) , canActivate : [AuthGuardService] , data : { role : 'admin'}} ,
  { path : 'member' , loadChildren : () => import('./modules/member/member.module').then(mod => mod.MemberModule) , canActivate : [AuthGuardService] ,   data : { role : 'member'}} ,
  { path : 'user'   , loadChildren : () => import('./modules/user/user.module').then(mod => mod.UserModule) , canActivate : [AuthGuardService] , data : { role : 'user'}} ,

  { path : '**' , component : NotFoundComponent }
];
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

redirect-guard.service.ts

import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthService } from '../auth-service/auth-service.service';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class RedirectGuardService implements CanActivate {
  constructor(
      private router: Router,
      private authService: AuthService
  ) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean> | Promise<boolean> | boolean {
    const user = this.authService.userVal;
    if (user) {      
      this.router.navigate(['/'+ user.role]);
      return true;      
    }      
    this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
    return false;
  }
}

【讨论】:

  • 如果同一个路由必须被两个角色访问,你怎么能做到这一点?这适用于子路线吗? { path: '',canActivate: [AuthGuard],component:SideNavComponent,children: [ 4 child routes here with lazy load components]
  • 你可以像这样传递多个角色。 { path : 'user-member' , loadChildren : () => import('./modules/user-member/user-member.module').then(mod => mod.UserMemberModule) , canActivate : [AuthGuardService] , data : { roles : ['user', 'member']}} ,并在 AuthGuard 服务中使用此角色数组检查登录用户的角色。对上述路由对象的问题的回答是肯定的,它会起作用。
【解决方案2】:

用这条线告诉我。您必须使用路由器构造函数。

this.router.navigate(['site/home');

【讨论】:

  • 如果用户使用默认网址会怎样。就像在本地主机上,如果用户在:localhost:4200,用户应该被重定向到一个延迟加载模块,但基于它的角色。
  • 你没有明白我的意思。登录后,当 URL 中没有指定 routerLink 时,如 localhost:4200 并且用户角色是 admin ,应该有一个路由器路径显示 管理惰性模块.
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2023-03-09
相关资源
最近更新 更多