Nest.js:Global AuthGuard,但有例外

时间:2018-03-22 12:54:02

标签: nestjs

我想在我的应用程序上全局注册我的AuthenticationGuard,它会检查身份验证,因此默认情况下所有路由都需要身份验证。

const authGuard = app
    .select(AuthModule)
    .get(AuthGuard);
app.useGlobalGuards(authGuard);

添加路由例外的最佳/ nest.js方法是什么,以便也可以实现匿名路由?

2 个答案:

答案 0 :(得分:3)

无法以简洁的方式配置此类行为。如果使用useGlobalGuards,则唯一的方法是自定义或扩展AuthGuard

See original issue

答案 1 :(得分:0)

您实际上可以为全局 AuthGuard 设置元数据,以便它可以确定是否应该允许未经授权的请求。

例如

设置全局身份验证保护

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { AuthGuard } from './auth.guard';

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

使用 SetMetadata 将数据传递给 AuthGuard

import { SetMetadata } from '@nestjs/common';
// Convienience Function
const AllowUnauthorizedRequest = () => SetMetadata('allowUnauthorizedRequest', true);
@Controller()
export class AppController {

  @Get('my-unauthorized-path')
  @AllowUnauthorizedRequest()
  myHandler () {
    return { unauthorized: true };
  }

}

使用从 SetMetadata 传入的数据来确定是否允许未经授权的请求。

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { validateRequest } from './validateRequest' // your custom implementation

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(private reflector: Reflector) {}
  canActivate(context: ExecutionContext) {
    const request = context.switchToHttp().getRequest();
    const allowUnauthorizedRequest = this.reflector.get<boolean>('allowUnauthorizedRequest', context.getHandler());
    return allowUnauthorizedRequest || validateRequest(request);
  }

}