相同的 URL 路径,但根据用户角色加载不同的组件 - Angular

Posted

技术标签:

【中文标题】相同的 URL 路径,但根据用户角色加载不同的组件 - Angular【英文标题】:Same URL path but loading different components based on User role - Angular 【发布时间】:2019-08-17 07:51:14 【问题描述】:

我希望有 2 个组件具有相同的路由(根“/”),但根据用户的角色(访客或已验证)仅加载一个。因此,Guest 的主页和 Authenticated 的主页具有相同的路径。

我尝试为访客创建一个守卫,为经过身份验证的用户创建一个守卫,并在 Routes 数组中的组件中应用每个守卫,如下所示:

export const AppRoutes: Routes = [
    
        path: '',
        component: GuestLayoutComponent,
        canActivate: [GuestGuard],
        children: [
            
                path: '',
                loadChildren: './guest-components/guest.module#GuestModule',
            
        ],
    ,
    
        path: '',
        component: AuthLayoutComponent,
        canActivate: [AuthGuard],
        children: [
            
                path: '',
                loadChildren: './auth-components/auth.module#AuthModule',
            
        ],
    ,
    
        path: '**',
        component: ErrComponent,
    ,
];

但它创建了一个无限循环。

也分享:

GuestRoutes

export const GuestRoutes: Routes = [
    
        path: '',
        children: [
        
            path: '',
            component: GuestHomeComponent,
        , 
            path: 'about-guest',
            component: GuestAboutComponent,
            pathMatch: 'full'
        ,
        ]
    
];

AuthRoutes:

export const AuthRoutes: Routes = [
    
        path: '',
        children: [
        
            path: '',
            component: AuthHomeComponent,
        , 
            path: 'about',
            component: AuthAboutComponent,
            pathMatch: 'full'
        ,
        ]
    

AuthGuard:

export class AuthGuard implements CanActivate 
constructor(private authService: AuthService, private router: Router) 

    canActivate(route: ActivatedRouteSnapshot,
                state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean 
        return this.authService.isAuthenticated()
        .then(
            (authenticated: boolean) => 
            if (authenticated) 
                return true;
             else 
                this.router.navigate(['/']);
                return false;
            
            
        );
    

GuestGuard:

export class GuestGuard implements CanActivate 
constructor(private authService: AuthService, private router: Router) 

    canActivate(route: ActivatedRouteSnapshot,
                state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean 
        return this.authService.isAuthenticated()
        .then(
            (authenticated: boolean) => 
            if (authenticated) 
                this.router.navigate(['/']);
                return false;
             else 
                return true;
            
            
        );
    

请查找link to the demo。

我怎样才能做到这一点?我将不胜感激。

【问题讨论】:

【参考方案1】:

我认为不可能有 2 个组件具有完全相同的路线。我不记得以前见过解决方案。

我不知道您为什么要完成此操作,但希望以下方法可以帮助您。创建一个名为 ContainerHomeComponent 的父组件,您将其指向您的路线。在 .ts 文件中,您查询“this.authService.isAuthenticated()”以查找用户是否经过身份验证并分配给名为“authenticated”的属性。在模板中你只有:

<app-guest-home-component *ngIf="!authenticated"></app-guest-home-component>

<app-auth-home-component *ngIf="authenticated"></app-auth-home-component>

【讨论】:

这样做的原因是将经过身份验证的用户发送到他/她的仪表板,并将访客用户发送到登录页面。类似于具有这种架构的网站,例如脸书、推特 那么我认为这种方法可以解决您的问题。刚刚意识到这种方法不会让您延迟加载 AuthModule 和 GuestModule,所以这将是一个缺点。

以上是关于相同的 URL 路径,但根据用户角色加载不同的组件 - Angular的主要内容,如果未能解决你的问题,请参考以下文章

Glide加载相同URL时由于缓存无法更新图片

django的权限组件

小程序动态加载底部导航(根据不同角色展示不同导航栏)

Spring Security(Java Config)登录 - 根据用户角色返回不同的 URL

用户角色的不同目标 URL

Angular2路由器2.0.0在加载不同参数的相同url时不重新加载组件?