1

我有一个 Angular 4 应用程序,并且已经实现了一个保护来处理身份验证。我们有不同的模块,它们使用工厂来创建我们称之为 ThemeService 的东西。每个模块都是具有自己的样式和安全性的自包含应用程序。每个模块都告诉 ThemeService 用户必须拥有什么角色才能访问,并且守卫工作得很好。

这是守门员:

 export class AuthenticatedGuard implements CanActivate
    {
        constructor (private memSrv:MembershipService,
private themeSrv:ThemeService,private router:Router )
        {
        }
        canActivate(
            route: ActivatedRouteSnapshot,
            state: RouterStateSnapshot
        ): Observable<boolean> | Promise<boolean> | boolean {

            return this.memSrv.GetCurrentUser()
                .map(u => {
                    if (!u) {
                        this.router.navigate([this.themeSrv.LoginUrl]);
                        return false;
                    }
                    var isAuth = u.Capabilities.some(s => s === this.themeSrv.AuthCapability);
                    if (isAuth) {
                        return true;
                    }
                    else {
                        //TODO: This is an unauthorized but authenticated user it should go to an unauthorized page
                        this.router.navigate(["/Unauthorized", { url: state.url }]);
                        return false;
                    }
                }
                );


        }
    }

我现在有一个模块,它有一些需要使用不同角色保护的路由。我的问题是如何将必须为每个路由检查的角色传递给 AuthenticationGuard。我不想为我们想要检查的每个角色创建一个不同的后卫。

贝娄是我的路线配置的片段

   {
        path: "",
        component: Component.MainComponent, 
        children:
        [
            {
                path: 'attachmentsTest',
                component: Component.AttachmentsTestComponent,
            },
            {
                path:"home",
                component: Component.HomeComponent,
                canActivate: [AuthenticatedGuard],
                resolve: {
                    user: CurrentUserResolver
                }
            }, 
4

1 回答 1

2

是的,您可以将值放入路由配置中,以便稍后使用该data属性提取。这是一个例子:

@NgModule({
  imports: [
    RouterModule.forChild([
      { 
        path: 'products',
        component: ProductListComponent,
        data: { pageTitle: 'Product List' }
      },
      { path: 'products/:id', component: ProductDetailComponent },
      { path: 'products/:id/edit', component: ProductEditComponent }
    ])
  ],  // ...

注意这里的数据属性。

然后,您可以使用如下语法读取该属性:

this.pageTitle = this.route.snapshot.data['pageTitle'];
于 2018-01-23T19:15:35.007 回答