当前位置: 首页 > news >正文

Nestjs全网最佳翻译-概况-守卫-Guards

守卫

带上装饰器 @Injectable() 并实现了 CanActivate 接口的类,就是守卫。

来自静态目录的图像

守护只做一件事情。他们根据运行时的某些条件(如权限、角色、ACL等)来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中,授权、认证通常由中间件处理。中间件对于认证来说是一个很好的选择,因为像令牌验证和为请求对象附加属性这样的事情与特定的路由上下文(及其元数据)没有紧密联系。

但是,中间件存在天然缺陷。它不知道在调用next()函数后,哪个处理程序将被执行。另一方面,守卫可以访问 ExecutionContext 实例,因此知道下一步将执行什么。它们的设计很像异常过滤器、管道和拦截器,可以让你在请求/响应周期中的正确位置插入处理逻辑,而且是以声明的方式进行。

守护在所有中间件之后执行,但在任何拦截器或管道之前。

授权守卫

如前所述,授权是守卫的典型的使用案例,因为只有当调用者(通常是一个特定的认证用户)有足够的权限时,特定的路由才能使用。下面代码里面的 AuthGuard 假定有一个经过认证的用户(因此,在请求头文件中附有一个令牌)。它将提取并验证令牌,并使用提取的信息来确定请求是否可以继续。

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';@Injectable()
export class AuthGuard implements CanActivate {canActivate(context: ExecutionContext,): boolean | Promise<boolean> | Observable<boolean> {const request = context.switchToHttp().getRequest();return validateRequest(request);}
}

如果你正在寻找一个关于如何在你的应用程序中实现认证机制的真实案例,请访问本章。同样,对于更复杂的授权例子,请查看本页面。

validateRequest()函数内部的逻辑可以根据需要简单或复杂。这个例子的重点是展示守卫是如何融入请求/响应周期的。

每个守卫都必须实现一个canActivate()函数。这个函数应该返回一个布尔值,表明当前的请求是否被允许。它可以同步或异步地返回响应(通过Promise或Observable)。Nest使用返回值来控制下一个动作:

如果它返回true,该请求将被处理。
如果它返回false,Nest将拒绝该请求。

执行上下文

canActivate()函数需要一个参数,即ExecutionContext(执行上下文)实例。ExecutionContext 继承自 ArgumentsHost。我们之前在异常过滤器一章中看到了ArgumentsHost。在上面的例子中,我们只是使用了定义在ArgumentsHost上的相同的辅助方法,我们先前使用了这些方法,以获得对Request对象的引用。你可以参考异常过滤器一章中的Arguments host部分,了解更多关于这个主题的内容。

通过扩展ArgumentsHost,ExecutionContext还增加了几个新的辅助方法,提供关于当前执行过程的额外细节。这些细节有助于构建更多的通用守护,这些守护可以在广泛的控制器、方法和执行上下文中工作。在这里了解更多关于ExecutionContex的信息。

基于角色的认证

让我们建立一个功能更强的守卫,只允许具有特定角色的用户访问。我们将从一个基本的守卫开始,并在接下来的章节中对其进行构建。现在,它允许所有请求继续进行:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';@Injectable()
export class RolesGuard implements CanActivate {canActivate(context: ExecutionContext,): boolean | Promise<boolean> | Observable<boolean> {return true;}
}

绑定守卫

像管道和异常过滤器一样,守护可以作用在控制器上,方法上,或者全局的。下面,我们使用@UseGuards()装饰器设置了一个控制器上的守卫。这个装饰器可以接受一个单独的参数,或者一个逗号分隔的参数列表。这让你可以通过一个声明轻松地应用适当的守卫集。

@Controller('cats')
@UseGuards(RolesGuard)
export class CatsController {}

@UseGuards() 装饰器是从 @nestjs/common 包中导入的。

上面,我们传递了RolesGuard类(而不是一个实例),将实例化的责任留给了框架,并实现了依赖性注入。与管道和异常过滤器一样,我们也可以传递一个新的实例:

@Controller('cats')
@UseGuards(new RolesGuard())
export class CatsController {}

上面的代码处理的时候会将守卫附加到这个控制器所声明的每个处理程序上。如果我们希望守卫只适用于一个方法,我们可以在方法层应用@UseGuards() 装饰器。

为了设置全局守卫,使用Nest应用程序实例的useGlobalGuards()方法:

const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new RolesGuard());

对于混合型应用程序,useGlobalGuards()方法默认不为网关和微服务设置守卫(关于如何改变这一行为的信息,请参见混合型应用程序)。对于 “标准”(非混合型)微服务应用程序,useGlobalGuards()确实在全局范围内安装防护。(译者注:这里和pipes里面的一样的)

全局守卫在整个应用程序中会作用在每个控制器和每个路由处理程序。在依赖注入方面,从任何模块之外注册的全局守卫(如上面的例子中使用useGlobalGuards())不能注入依赖,因为这是在任何模块的上下文之外进行的。为了解决这个问题,你可以使用下面的方式直接从任何模块中设置一个守卫:(译者注:就是上面直接在app注册的守卫,module是引用不到的)

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';@Module({providers: [{provide: APP_GUARD,useClass: RolesGuard,},],
})
export class AppModule {}

当使用这种方法为守卫进行依赖性注入时,请注意,无论在哪个模块采用这种方式,守卫实际上都是全局性的。这应该在哪里进行呢?选择定义了防护(上面例子中的RolesGuard)的模块。另外,useClass并不是处理自定义提供者注册的唯一方法。在这里了解更多。

我们的RolesGuard可以工作了,但是它还不够聪明。我们还没有利用最重要的守卫特性–执行上下文。它还不知道角色,或者每个处理程序允许哪些角色。例如,CatsController可以为不同的路线提供不同的权限方案。有些可能只对管理员用户开放,而有些可能对所有人开放。我们怎样才能以一种灵活和可重用的方式将角色与路由相匹配呢?

这就是自定义元数据发挥作用的地方(在这里了解更多)。Nest提供了通过@SetMetadata()装饰器将自定义元数据附加到路由处理程序的能力。这个元数据提供了我们缺失的角色数据,智能守卫需要这些数据来做出决定。让我们来看看如何使用@SetMetadata():

@Post()
@SetMetadata('roles', ['admin'])
async create(@Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto);
}

@SetMetadata()装饰器是从@nestjs/common包中导入的。

通过上面的结构,我们将角色元数据(角色是一个key,而[‘admin’]是一个特定的value)附加到create()方法中。虽然这很有效,但在你的路由中直接使用@SetMetadata()并不是好的做法。相反,创建你自己的装饰器,如下所示:

import { SetMetadata } from '@nestjs/common';
export const Roles = (...roles: string[]) => SetMetadata('roles', roles);

这种方法更简洁、更易读,而且是强类型的。现在我们有一个自定义的@Roles()装饰器,我们可以用它来装饰create()方法。

@Post()
@Roles('admin')
async create(@Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto);
}

完善RolesGuard

现在让我们把 RolesGuard 功能完善起来。目前,它在所有情况下都简单地返回true,允许每个请求继续进行。我们想在比较分配给当前用户的角色和当前正在处理的路由所要求的实际角色的基础上,使返回值成为条件。为了访问路由的角色(自定义元数据),我们将使用Reflector帮助类,它是由框架提供的,并可以从@nestjs/core包中导入。

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';@Injectable()
export class RolesGuard implements CanActivate {constructor(private reflector: Reflector) {}canActivate(context: ExecutionContext): boolean {const roles = this.reflector.get<string[]>('roles', context.getHandler());if (!roles) {return true;}const request = context.switchToHttp().getRequest();const user = request.user;return matchRoles(roles, user.roles);}
}

在node.js世界中,通常的做法是将授权用户附加到请求对象中。因此,在我们上面的示例代码中,我们假设 request.user 包含用户实例和允许的角色。在你的应用程序中,你可能会在你的自定义认证防护(或中间件)中进行这种关联。请查看本章以了解有关这一主题的更多信息。

matchRoles()函数内部的逻辑可以根据需要简单或复杂。这个例子的重点是展示守卫如何融入请求/响应周期。

请参考执行上下文章节的反射和元数据部分,了解以上下文敏感的方式利用反射器的更多细节。

当权限不足的用户请求一个端点时,Nest自动返回以下响应:

{"statusCode": 403,"message": "Forbidden resource","error": "Forbidden"
}

请注意,当一个守卫返回错误时,Nestjs框架会抛出一个ForbiddenException。如果你想返回一个不同的错误响应,你应该抛出你自己的特定异常。比如说:

throw new UnauthorizedException();

由守卫装置抛出的任何异常将由异常层(全局异常过滤器和应用于当前上下文的任何异常过滤器)处理。

如果你正在寻找一个关于如何实现授权的真实例子,请查看本章。

总结

本章节主要内容如下:

守卫的主要职责。

守卫的重要特性ExecutionContext(执行上下文)。

守卫的作用范围。

如何建立基于角色的守卫。

利用装饰器封装守卫。

注意本章节代码只是演示代码,文中有具体例子的链接。

相关文章:

Nestjs全网最佳翻译-概况-守卫-Guards

守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类&#xff0c;就是守卫。 守护只做一件事情。他们根据运行时的某些条件&#xff08;如权限、角色、ACL等&#xff09;来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中…...

【软考网络管理员】2023年软考网管初级常见知识考点(3)- 网络体系结构

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…...

javascript正则表达式大括号、中括号、小括号的作用以及应用场景

在JavaScript正则表达式中&#xff0c;大括号 {}、中括号 [] 和小括号 () 都有不同的作用和应用场景。 大括号 {} 在正则表达式中&#xff0c;大括号 {} 表示重复次数。以下是一些常见的应用场景&#xff1a; {n}&#xff1a;精确匹配出现的次数&#xff0c;例如 \d{3} 匹配…...

5年测试老鸟总结,自动化测试的实施到落地,看这一篇足够...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…...

通达信顾比倒数线指标公式,信号不漂移

顾比倒数线是由技术派大师戴若顾比发明的&#xff0c;该指标利用三个重要的价格来判断入场或离场时机&#xff0c;可用于盘后制定下一个交易日的操作计划。此外&#xff0c;顾比倒数线还可以用于补充验证其他指标。 在编写顾比倒数线选股公式之前&#xff0c;需要先了解顾比倒…...

网络安全: CIDR无类别路由

网络安全&#xff1a; CIDR无类别路由 CIDR是无类别路由&#xff0c;出现CIDR的原因是因为ipv4的地址被使用完客&#xff0c;CIDR的出现暂缓了ipv4用完的速度。 原本的ipv4很刻板&#xff0c;网络号分成8位&#xff0c;16位&#xff0c;24位作为掩码&#xff0c;也就是 xxx.0…...

NetMQ | 发布订阅时使用含通配符的Topic

NetMQ | 发布订阅时使用含通配符的Topic 文章目录 NetMQ | 发布订阅时使用含通配符的Topic前言通配符如何使用通配符通配符的作用结束语 前言 今天我来介绍一下NetMQ发布订阅时如何使用含通配符的Topic&#xff0c;让我们能够更加灵活地订阅消息。 什么是Topic? 在NetMQ中&am…...

行为型模式-模板方法模式

模板方法模式 概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关…...

IPsec中IKE与ISAKMP过程分析(快速模式-消息1)

IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息1&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息2&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息3&#xff09;_搞搞搞高傲的博客…...

PostgreSQL 数据类型转换

各种数据类型&#xff08;日期/时间、integer、floating point和numeric&#xff09;转换成格式化的字符串及反过来从格式化的字符串转换成指定的数据类型&#xff0c;在实际操作中经常遇到。下面总结了一些常用的函数。 日期操作函数 函数返回类型描述实例to_char(timestamp…...

【Java笔试强训 1】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f9be;&#x1f9be;&#x1f9be; 目录 一、选择题 二、编程题 &#x1f525;组队竞…...

你买票了吗?五一火车票发售量创历史新高,车票总发售2209万张票

五一劳动节已经成为了除春节国庆节外最隆重的节日&#xff0c;是全国性的庆祝节日。在这个节日里&#xff0c;人们可以通过旅游、购物、娱乐等方式来放松身心&#xff0c;充满活力地迎接新的挑战。同时&#xff0c;五一假期也成为了国内外客流量最大的旅游黄金周之一&#xff0…...

DiffUtil的使用

RecyclerView的DiffUtil用于计算并更新RecyclerView中数据集的变化。通过使用DiffUtil&#xff0c;我们可以避免完全重新加载整个列表&#xff0c;并且只会更改必要的视图。 以下是DiffUtil的基本用法&#xff1a; 创建一个继承自DiffUtil.Callback的类来计算差异。在这个类中…...

【Python】【进阶篇】18、Django初始化项目环境精讲

目录 18、Django初始化项目环境精讲1. 完成数据库迁移2. PyMySQL模块的使用3. migrate与makemigrations命令详解1) makegrations生成数据库迁移文件2) migrate执行数据库迁移命令3) 完成数据库迁移总结 18、Django初始化项目环境精讲 上一节中&#xff0c;我们完成了对 settin…...

Web前端基础

一.说明 如果你要了解web前端领域&#xff0c;那么三种语言是你必须要了解的&#xff0c;即html5、CSS、Javascript是你必须要了解的&#xff0c;通过前面的专栏内容你一定对html标记语言非常熟悉&#xff0c;那么其他两种语言是什么&#xff0c;他们怎么和html联系在一起&…...

ACM 1007 | 分段函数求值

文章目录 0x00 前言 0x01 题目描述 0x02 问题分析 0x03 代码设计 0x04 完整代码 0x05 运行效果 0x06 总结 0x00 前言 C 语言网不仅提供 C 语言&#xff0c;还包括 C 、 java 、算法与数据结构等课程在内的各种入门教程、视频录像、编程经验、编译器教程及软件下载、题解博…...

ChatGPT技术原理 第十四章:未来发展方向

目录 14.1 多模态对话生成 14.2 跨语言对话生成 14.3 增量学习 14.4 深度强化学习...

大型水利投资集团,打造数智财资管理新范式

随着我国城市化进程的不断推进&#xff0c;城市基础设施在国民经济中的作用愈加重要&#xff0c;其建设水平直接影响一个城市的竞争力。国有城投、水投等企业作为城市基础设施建设的主要参与者&#xff0c;其重要性不言而喻。随着国家、地方对基础设施重要性认识的加深以及政府…...

【java】彻底剖析 Synchronized

文章目录 前言对象结构Monitor 对象Synchronized特征原子性可见性有序性可重入锁 锁升级的过程 前言 源码级别剖析Synchronized 对象结构 Synchronized是Java中的隐式锁&#xff0c;它的获取锁和释放锁都是隐式的&#xff0c;完全交由JVM帮助我们操作&#xff0c;在了解Sync…...

有反爬机制就爬不了吗?那是你还不知道反反爬,道高一尺魔高一丈啊

文章目录 一、从用户请求的Headers反爬虫二、基于用户行为反爬虫&#xff08;1&#xff09;方法1&#xff08;2&#xff09;方法2 三、动态页面的反爬虫四.总结 不知道你们在用爬虫爬数据的时候是否有发现&#xff0c;越来越多的网站都有自己的反爬机制&#xff0c;抓取数据已经…...

远程调试革新性实践:Chrome DevTools App全方位技术指南

远程调试革新性实践&#xff1a;Chrome DevTools App全方位技术指南 【免费下载链接】chrome-devtools-app Chrome DevTools packaged as an app via Electron 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-devtools-app 一、远程调试的核心价值&#xff1a;突破…...

Sora死了

好莱坞杀死了 Sora&#xff1a;传统行业在 AI 浪潮下的无谓挣扎摘要&#xff1a;2026 年 3 月 24 日&#xff0c;OpenAI 宣布关闭 Sora&#xff0c;距离正式发布仅 6 个月。表面看是迪士尼退出授权协议导致的商业失败&#xff0c;实质是传统内容行业对 AI 技术抵制的缩影。本文…...

SmallThinker-3B快速上手:Postman调用Ollama API实现批量COT推理测试

SmallThinker-3B快速上手&#xff1a;Postman调用Ollama API实现批量COT推理测试 1. 环境准备与模型部署 在开始使用SmallThinker-3B模型进行批量推理测试之前&#xff0c;我们需要先完成基础环境的搭建。 1.1 安装Ollama框架 Ollama是一个轻量级的模型部署框架&#xff0c…...

IC设计工程师必看:ESD测试四大组合详解与实战避坑指南

IC设计工程师必看&#xff1a;ESD测试四大组合详解与实战避坑指南 在集成电路设计领域&#xff0c;静电放电&#xff08;ESD&#xff09;防护能力是衡量芯片可靠性的关键指标之一。据统计&#xff0c;超过35%的芯片失效案例与ESD事件相关&#xff0c;而设计阶段的防护策略直接影…...

百融智能与中国人民大学高瓴人工智能学院智能体联合共建实验室正式揭牌

3月24日&#xff0c;百融智能&#xff08;原百融云创6608.HK&#xff09;与中国人民大学高瓴人工智能学院举行产学研合作发布会&#xff0c;并为“智能体联合实验室”揭牌。双方发布三项捐赠基金与六项联合研究课题&#xff0c;探索“科研攻关—人才培养—成果转化”的协同机制…...

AI辅助数据库设计:让快马平台智能生成优化过的社区论坛系统数据架构

今天想和大家分享一个用AI辅助设计数据库的实践案例——社区论坛系统的数据架构设计。整个过程在InsCode(快马)平台上完成&#xff0c;体验非常流畅。 业务场景分析 社区论坛的核心是内容交互&#xff0c;需要支持用户发帖、互动和管理。通过AI分析&#xff0c;我们确定了几个关…...

OpenClaw 最新保姆级飞书对接指南教程 搭建属于你的 AI 助手

OpenClaw 是什么&#xff1f; OpenClaw(原名 Clawdbot,后更名为 Moltbot,现正式命名为 OpenClaw)是一个运行在你本地环境的高权限 AI 智能体。它的核心特性包括&#xff1a; 本地部署&#xff1a;运行在你的服务器或电脑上,数据完全自主可控多平台支持&#xff1a;支持飞书、…...

2026年AI Agent崛起:从知识库到智慧助手,收藏这份程序员必看指南!

2026年&#xff0c;AI智能体将大规模部署&#xff0c;成为企业数字化核心。与传统AI知识库不同&#xff0c;智能体具备规划、执行、反思和记忆能力&#xff0c;能自主完成任务。核心应用包括跨系统自动化、智能客服、IT运维等。企业需关注多智能体协同、与RPA融合、开放协议及人…...

链篦机回转窑球团生产全流程解析:从配料到成品输出的关键步骤

链篦机回转窑球团生产全流程解析&#xff1a;从配料到成品输出的关键步骤 钢铁工业作为现代工业的基石&#xff0c;其原料制备工艺直接影响最终产品的质量与成本。在众多铁矿石加工工艺中&#xff0c;链篦机-回转窑球团生产工艺因其高效、节能、环保等优势&#xff0c;已成为现…...

WebSocket避坑指南:用ws库时你可能会遇到的5个典型问题

WebSocket实战避坑指南&#xff1a;5个高频问题与深度解决方案 1. 连接稳定性&#xff1a;从握手失败到心跳检测 WebSocket连接建立阶段最常见的错误是HTTP 101 Switching Protocols响应失败。某电商平台的监控数据显示&#xff0c;约23%的连接异常发生在握手阶段。以下是典型错…...