代码之家  ›  专栏  ›  技术社区  ›  HansMusterWhatElse

角度-跨不同模块提供防护

  •  0
  • HansMusterWhatElse  · 技术社区  · 7 年前

    目前我基本上有以下角度模块:

    1. landing
    2. admin
    3. core
    4. shared

    我想注册一个叫 AuthenticationGuard 共享的 模块,并跨不同模块提供它。

    目前只有在 landing-module (这是我引导的)如果我在 admin.module shared.module

    如果我这样做,我会收到一个错误,说明如下:

    enter image description here

    注册 guard 通过以下方式完成 providers 相应模块的数组。

    我的目标是能够在所有模块中使用它。

    从注入服务时没有问题 果心 管理 模块-所以我假设 guards services 总的来说?

    目前,一些相关文件如下所示(为简洁起见,将其缩短):

    着陆。单元ts

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    
    import { HomeComponent } from './home/home.component';
    import { LandingRoutingModule } from './landing.routing.module';
    
    import { SharedModule } from '../shared/shared.module';
    import { CoreModule } from '../core/core.module';
    import { SecurityModule } from '../security/security.module';
    import { AdminModule } from '../admin/admin.module';
    
    @NgModule({
      declarations: [
        HomeComponent
      ],
      imports: [
        SharedModule.forRoot(),
        CoreModule.forRoot(),
        SecurityModule,
        LandingRoutingModule
      ],
      providers: [],
      bootstrap: [HomeComponent]
    })
    export class AppModule { }
    

    着陆。工艺路线。单元

    import { NgModule } from '@angular/core';
    import { RouterModule, Routes } from '@angular/router';
    import { HttpClientModule } from '@angular/common/http';
    
    import { HomeComponent } from './home/home.component'
    import { NotFoundComponent } from './../shared/components/not-found/not-found.component';
    
    const appRoutes: Routes = [
      {
        path : '',
        redirectTo : '/login',
        pathMatch: 'full'
      },
      {
        path : 'admin',
        loadChildren: 'app/modules/admin/admin.module#AdminModule'
      },
      { 
        path: '**', 
        component: NotFoundComponent 
      }
    ];
    
    @NgModule({
      declarations: [],
      imports: [
        HttpClientModule,
        RouterModule.forRoot(
          appRoutes,
          { enableTracing: true }
        )
      ],
      exports: [
        RouterModule
      ],
    })
    
    export class LandingRoutingModule { }
    

    管理单元

    import { NgModule, ModuleWithProviders } from '@angular/core';
    import { CommonModule } from '@angular/common';
    import { SharedModule } from '../shared/shared.module';
    
    import { AdminLandingComponent } from './admin-landing/admin- 
    landing.component'
    import { AdminChildComponent } from './admin-child/admin-child.component'
    import { AdminRoutingModule } from './admin.routing.module';
    
    @NgModule({
      declarations: [
        AdminLandingComponent,
        AdminChildComponent
      ],
      imports: [
        CommonModule,
        AdminRoutingModule
      ],
    })
    export class AdminModule { }
    

    管理工艺路线。单元

    import { NgModule } from '@angular/core';
    import { RouterModule, Routes } from '@angular/router';
    
    import { AdminLandingComponent } from './admin-landing/admin- 
    landing.component';
    import { AdminChildComponent } from './admin-child/admin-child.component';
    
    import { AuthenticationGuard } from '../shared/guards/auth-guard.service'
    
    const adminRoutes: Routes = [
        {
            path: '',
            component: AdminLandingComponent,
            canActivate: [AuthenticationGuard],
            children: [
                {
                    path: '',
                    children: [
                        { path: 'child', component: AdminChildComponent }
                    ]
                }
            ]
        }
    ];
    
    @NgModule({
        declarations: [],
        imports: [
            RouterModule.forChild(adminRoutes)
        ],
        exports: [
            RouterModule
        ],
    })
    
    export class AdminRoutingModule { }
    

    已共享。单元

    import { NgModule, ModuleWithProviders } from '@angular/core';
    import { CommonModule } from '@angular/common';
    
    import { NotFoundComponent } from './components/not-found/not- 
    found.component'
    import { AuthenticationGuard } from './guards/auth-guard.service';
    
    @NgModule({
      declarations: [
        NotFoundComponent,  
      ],
      imports: [
        CommonModule
      ],
    })
    
    export class SharedModule {
      static forRoot(): ModuleWithProviders {
        return {
          ngModule: SharedModule,
          providers: [AuthenticationGuard]
        };
      }
    }
    

    授权守卫。服务

    import { Injectable }               from '@angular/core';
    import {
        CanActivate, Router,
        ActivatedRouteSnapshot,
        RouterStateSnapshot,
        CanActivateChild,
        NavigationExtras,
        CanLoad,
        Route
    }                                   from '@angular/router';
    import { AuthenticationService }    from '../../core/services/authentication-service/authentication.service';
    
    @Injectable()
    export class AuthenticationGuard implements CanActivate, CanActivateChild, CanLoad {
    
        constructor(private authService: AuthenticationService, private router: Router) { }
    
        canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
            return true;
        }
    
        canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
            return this.canActivate(route, state);
        }
    
        canLoad(route: Route): boolean {
            return true;
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Andrew Lobban    7 年前

    您需要导入 AuthenticationService 在模块decorator中 providers 大堆这就是那个错误所表明的!

    根据你这里的情况,我看不到 AuthenticationService 在任何模块中添加为提供程序。除非它在你的 app.modules.ts 此处未显示。