是否可以使用控制器/方法作用域的全局范围保护覆盖全局范围的保护



我正在使用NestJS框架编写webAPI。我无法使用放置在方法或控制器级别的保护覆盖全局范围的防护。我的所有端点都将使用 JWT 验证保护,除了用于登录系统的端点。是否可以在根级别创建一个防护,并在单个方法级别仅使用@UseGuard()装饰器覆盖此全局防护?

我尝试在函数调用之前使用保护listen并使用APP_GUARD提供程序,但在这两种情况下我都无法覆盖此行为。

代码示例:https://codesandbox.io/embed/nest-yymkf

只是为了加上我的 2 美分。

我没有像 OP 那样定义 2 个守卫(rejectaccept(,而是定义了一个自定义装饰器:

import { SetMetadata } from '@nestjs/common'
export const NoAuth = () => SetMetadata('no-auth', true)

剔除守卫(AuthGuard(使用Reflector来访问装饰器的元数据,并决定是否基于它激活。

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'
import { Reflector } from '@nestjs/core'
import { Observable } from 'rxjs'
@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private readonly reflector: Reflector) {}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const noAuth = this.reflector.get<boolean>('no-auth', context.getHandler())
    if(noAuth) return true
    // else your logic here
  }
}

然后,我将reject保护全局绑定到某个模块中:

@Module({
  providers: [{
    provide: APP_GUARD,
    useClass: AuthGuard
  }]
})

并在需要时继续使用装饰器:

@NoAuth()
@Get() // anyone can access this
getHello(): string {
  return 'Hello Stranger!'
}
@Get('secret') // protected by the global guard
getSecret(): string {
  return 'ssshhh!' 
}

发布问题后,我想出了我的问题的解决方案。我应该在我的控制器中添加一些自定义元数据,并在守卫中放置一个逻辑来读取该元数据。我已经更新了代码示例。

相关内容

  • 没有找到相关文章

最新更新