Nest.js:全局 AuthGuard,但有例外

AyK*_*rsi 8 nestjs

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

const authGuard = app
    .select(AuthModule)
    .get(AuthGuard);
app.useGlobalGuards(authGuard);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*002 45

您实际上可以为全局设置元数据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 {}

Run Code Online (Sandbox Code Playgroud)

用于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 };
      }
    
    }
    
Run Code Online (Sandbox Code Playgroud)

使用传入的数据来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);
      }
    
    }
Run Code Online (Sandbox Code Playgroud)


ama*_*kkg 6

没有办法以简洁的方式配置这种行为。如果useGlobalGuards使用,唯一的方法是自定义或扩展AuthGuard.

查看原始问题

  • 人们可能应该看看@jonathan002下面(或上面)的赞成答案,而不是我的 (5认同)