Redirect NestJS-检查失败时从guard重定向用户

Redirect NestJS-检查失败时从guard重定向用户,redirect,nestjs,Redirect,Nestjs,我已经在正在构建的NestJS应用程序中添加了一些简单、有效的登录功能。我现在想阻止注销用户访问某些路由,因此我添加了一个简单的AuthGuard,如下所示 @Injectable() export class AuthGuard implements CanActivate { public canActivate( context: ExecutionContext, ): boolean { const request = context.s

我已经在正在构建的NestJS应用程序中添加了一些简单、有效的登录功能。我现在想阻止注销用户访问某些路由,因此我添加了一个简单的
AuthGuard
,如下所示

@Injectable()
export class AuthGuard implements CanActivate {
    public canActivate(
        context: ExecutionContext,
    ): boolean {
        const request = context.switchToHttp().getRequest();
        const response = context.switchToHttp().getResponse();
        if (typeof request.session.authenticated !== "undefined" && request.session.authenticated === true) {
            return true;
        }
        return false;
    }
}
它的工作原理是阻止用户访问应用防护的路由,但这样做只是显示了JSON响应

{
    "statusCode": 403,
    "error": "Forbidden",
    "message": "Forbidden resource"
}
我想要的是,当防护失败时,用户被重定向到登录页面。我已经尝试用
response.redirect(“/auth/login”)替换
returnfalse
虽然它可以工作,但在控制台中我会收到消息

(节点:11526)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):错误:发送后无法设置头。

(节点:11526)[DEP0018]弃用警告:未处理的承诺拒绝被弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。

因此,尽管它有效,但它似乎不是最好的解决方案

呼叫警卫的路线如下:

@Get()
@UseGuards(AuthGuard)
@Render("index")
public index() {
    return {
        user: {},
    };
}

防护失败后,是否有可能正确重定向用户?

应该返回JSON的端点返回对HTML内容的重定向,这似乎非常奇怪

不过,如果您想管理如何使用用户友好的自定义内容处理异常,我建议您查看异常过滤器:

直接从nestjs的文档中粘贴,下面是一个明确的示例:

import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { HttpException } from '@nestjs/common';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    const status = exception.getStatus();

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
      });
  }
}

您可以使用guard和filter实现您想要的功能。通过来自guard的未授权异常并处理来自filter的异常以重定向。下面是一个这样的过滤器:

import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
} from '@nestjs/common';
import { Response } from 'express';
import { UnauthorizedException } from '@nestjs/common';

@Catch(UnauthorizedException)
export class ViewAuthFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const status = exception.getStatus();

    response.status(status).redirect('/admins');
  }
}

谢谢,这对我帮助很大,只是我做了两件不同的事。1)
@Catch(禁止例外)
对于这种类型的错误2)浏览器完全忽略了状态,因此我将其放在重定向调用中:
response.redirect('/auth/login',status)
@Get('/dashboard')
@UseGuards(JwtGuard)
@UseFilters(ViewAuthFilter)
@Render('dashboard/index')
dashboard() {
    return {};
}