Инициализировать Guard со значением - PullRequest
0 голосов
/ 06 февраля 2019

Можно ли инициализировать охрану с указанным значением?Например, текущий пример не будет работать:

@Module({
  imports: [
    CoreModule,
  ],
  providers: [
    {
      provide: AuthGuard, // while using APP_GUARD works
      useFactory: (configService: ConfigService) => {
        return new AuthGuard(configService.get('some_key'));
      },
      inject: [ConfigService],
    },
  ],
})

При использовании APP_GUARD для provide инициализирует охрану со значением конфигурации.Так что это работает только для глобальной области видимости, но не для @UseGuards(AuthGuard)

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Это не работает, потому что охранники не зарегистрированы в качестве поставщиков в модуле.Они непосредственно создаются в фреймворке.

Вы можете использовать инъекцию зависимостей в охранник:

@Injectable()
export class MyAuthGuard {
  constructor(private readonly configService: ConfigService) {
    // use the configService here
  }
}

и

@UseGuards(MyAuthGuard)

или создать экземпляр защитника самостоятельно:

@UseGuards(new AuthGuard(configService.get('some_key')))

В особом случае AuthGuard вы можете установить defaultStrategy в PassportModule.Тогда вы можете просто использовать @UseGuards(AuthGuard())

PassportModule.register({ defaultStrategy: 'jwt'}) 

или async:

PassportModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({ defaultStrategy: configService.authStrategy}),
  inject: [ConfigService],
}) 
0 голосов
/ 06 февраля 2019

Я бы попробовал менее подробный подход и внедрил бы ConfigService непосредственно в AuthGuard таким образом:

@Module({
  imports: [
    CoreModule,
  ],
  providers: [
    AuthGuard,
  ],
  exports: [
    AuthGuard,
  ],
})
@Injectable()
export default class AuthGuard {
  constructor (protected readonly config: ConfigService) {
  }
  /*
  ...
  */
}
...