Angular 5 基于角色的路由

问题描述 投票:0回答:3

我有一个网站,其主页在我的路由模块中定义为:

const appRoutes: Routes = [
{
  path: '',
  component: HomeComponent
}];

现在我想为管理员用户显示不同的主页(仪表板页面)。 我可以更改根据用户角色调用的“组件”吗?

伪代码如下:

const appRoutes: Routes = [
{
  path: '',
  IF UserRole = 'Admin'
     component: DashboardComponent
  ELSE
     component: HomeComponent
}];
typescript angular5
3个回答
5
投票
@andrea06590 答案中的教程链接非常简短地概述了基于身份验证和授权的路由。 简而言之,有人可以使用以下方式:


    使用 canActivate 属性并向其传递一个实现 CanActivate 接口的服务类。
  1. 使用数据对象属性将角色传递给 AuthGuard 服务。

app.routing.module.ts

import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; const routes: Routes = [ { path : '' , redirectTo : '', pathMatch: 'full' , canActivate : [ RedirectGuardService ] }, { path : 'admin' , component : AdminComponent , canActivate : [AuthGuardService] , data : { role : 'admin'}}, { path : 'user' , component : UserComponent , canActivate : [AuthGuardService] , data : { role : 'user'}} { path : '**' , component : NotFoundComponent } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }

auth-guard.service.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; // Getting User Value by decoding JWT Token const role = route.data.role; // Getting role value which we passed to data object in router configuration if (currentUser) { if(role && role.indexOf(currentUser.role) > -1) return true; else return false; } return false; } }


重定向-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'; import { IUser } from 'client/app/interfaces'; @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 = <IUser>this.authService.userVal; if (user && user['user']) { this.router.navigate(['/'+ user['user'].role]); return true; } this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }}); return false; } }
    

-1
投票
为此,有一种称为 Angular Guards Route 的东西

https://medium.com/@ryanchenkie_40935/angular-authentication-using-route-guards-bf7a4ca13ae3


-1
投票
您一定会在此页面上找到您需要的东西:

https://angular.io/guide/router

但是作为一个快速而肮脏的答案,您可以检查用户是否是 HomeComponent 中的管理员,如果是则重定向他。

© www.soinside.com 2019 - 2024. All rights reserved.