一篇文章学会如何使用 NestJS 的 Guards 守卫实现系统用户身份验证和授权

前言

当我们基于NestJS框架构建和管理应用程序时,为了保障其安全性,我们常常需要对某些敏感操作或敏感信息的访问进行限制,这是我们需要使用到 守卫 的地方。它作为一种可以阻止未经授权的访问的机制,对我们的应用程序起到了守护的作用。

在这篇文章中,我将深入剖析 NestJS 的守卫,以帮您全面了解这个概念。我会从解释其背后的工作机制开始,接着介绍使用守卫的各种场景,并以详细的示例来演示如何在 NestJS 项目中实现和使用守卫。

什么是 Guards 守卫

在去解析NestJS的守卫之前,我们先来简单了解一下NestJS。NestJS是一种设计用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript,并结合了 OOP、FP 和 FRP 的元素。

既然我们已经对NestJS有了基本的理解,那么,什么是NestJS的守卫(Guards)呢?简单来说,守卫(Guards)是NestJS中的一个概念,其职责就像其名字一样,它起到了保护我们应用程序不被未经授权的访问的作用。在特定的路由处理程序执行之前,守卫负责确定请求是否应该被路由处理程序处理。

使用场景

守卫通常用于身份验证和授权,也就是在执行业务代码之前验证用户是否有权做出某个操作。

例如,在许多应用程序中,你需要防止未经授权的用户访问敏感信息或执行特定的操作。若用户请求查看或修改某些只有特定权限或角色才能查看或修改的数据时,守卫即可起到“守门人”的作用。

使用案例

一、创建一个身份验证守卫

我们首先要创建一个 AuthGuard 类并注入它。这个类需要实现 CanActivate 接口并实现 canActivate 方法:

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();// 添加你的身份验证逻辑// For example:return validateRequest(request);}
}

在上面的示例中,我们首先从 @nestjs/common 包导入了 InjectableCanActivate 和 ExecutionContext。然后,我们创建了一个 AuthGuard 类,它会实现 CanActivate 接口,这个接口要求我们实现 canActivate 方法。

在这个方法中,我们首先获取上下文请求对象。然后,我们可以在这个方法中执行我们需要的任何判断逻辑,比如检查请求中是否包含有效的 JWT 令牌。

二、使用身份验证守卫(控制器维度)

现在,我们已经创建了守卫,那该如何使用呢?其实非常简单,我们只需要在控制器或者具体路由上添加 @UseGuards() 装饰器:

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';@Controller('users')
@UseGuards(AuthGuard)
export class UserController {@Get()findAll() {return "这个操作返回所有的猫,只有通过身份验证的用户能看到!";}
}

这样,我们就可以确保只有通过 AuthGuard 权限认证的用户才能够访问到我们的 CatsController 控制器中的所有路由。

三、使用身份验证守卫(路由维度)

如果你只希望在某个特定的路由上应用这个守卫,而不是整个控制器,你可以将 UseGuards 装饰器应用于具体的路由处理函数:

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';@Controller('cats')
export class CatsController {@Get()@UseGuards(AuthGuard)findOne() {return "这个操作返回一只猫,只有通过身份验证的用户能看到!";}
}

总结

以上我们已经展示了如何创建和使用自定义守卫。然而,在真实的业务场景中,可能会有更复杂的情况,比如基于角色的访问控制(Role-Based Access Control, RBAC)。这种情况下,你的守卫可能需要复杂的逻辑来确定一个用户能接触哪些资源。这些都是你可以使用守卫来处理的场景。

总的来说,NestJS 的守卫是一个非常强大的工具,特别是对于大型和复杂的项目,在权限判断上,使用守卫可以极大地提高代码的可维护性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于C#的机械臂欧拉角与旋转矩阵转换

欧拉角概述 机器人末端执行器姿态描述方法主要有四种&#xff1a;旋转矩阵法、欧拉角法、等效轴角法和四元数法。所以&#xff0c;欧拉角是描述机械臂末端姿态的重要方法之一。 关于欧拉角的历史&#xff0c;由来已久&#xff0c;莱昂哈德欧拉用欧拉角来描述刚体在三维欧几里…

Android 13屏蔽Activity或包的手势禁止滑动退出

在Android设备中&#xff0c;左/右滑两次会出现一个箭头然后退出Activity页面&#xff0c;有些Activity页面不想出现箭头及退出&#xff0e; 以下是对项目中的别人已实现的代码解析&#xff0e; 在config.xml中配置要禁用的Activity packages/apps/Launcher3/quickstep/res/v…

如何找到并杀掉占用显存的僵尸进程

如何找到并杀掉占用显存的僵尸进程 nvitop 命令发现占用显存的僵尸进程 nvitop 命令可以实时监控显卡显存的占用&#xff0c;CPU 的占用&#xff0c;以及占用显卡的进程信息等&#xff08;如下图&#xff09;。nvitop 中显示 No Such Process 的进程&#xff0c;且它的 CPU 使…

【SpringCloud Alibaba笔记】(2)Nacos服务注册与配置中心

Nacos Nacos简介与下载 是什么&#xff1f; 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;就是注册中心&#xff0b;配置中心的组合 Nacos Eureka Config Bus 替代Eureka…

for循环--均分纸牌

均分纸牌 均分纸牌 题意 把给定的纸牌均匀分配成相同的数目&#xff0c;问最少需要几次步骤实现&#xff08;注意第一个只能往第二个分&#xff0c;最后一个只能往前一个分&#xff09; 思路 多列几个例子发现主要判断a[i]是否与平均数相等&#xff0c;所以按这个条件写出代码…

前端 js 基础对象 (3)

js 对象定义 <!DOCTYPE html> <html> <body><h1>JavaScript 对象创建</h1><p id"demo1"></p> <p>new</p> <p id"demo"></p><script> // 创建对象&#xff1a; var persona {fi…

数据结构与算法——符号表API设计及有序符号表设计

Java学习手册面试指南&#xff1a;https://javaxiaobear.cn 符号表最主要的目的就是将一个键和一个值联系起来&#xff0c;符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据&#xff0c;我们可以根据键来查找对应的值。 符号表中&#xff0c;键具有唯一性。 符…

Linux文件系统调用接口

文件内容属性 所有对文件的操作就是对 1.文件内容 2.文件属性。 内容是数据&#xff0c;属性也是数据&#xff0c;存储文件&#xff0c;必须既存储内容&#xff0c;也要存储属性。 文件没有被访问时&#xff0c;一般在磁盘中。对文件访问时&#xff0c;由冯诺依曼体系结构知…

媒体捕捉-拍照

引言 在项目开发中&#xff0c;从媒体库中选择图片或使用相机拍摄图片是一个极为普遍的需求。通常&#xff0c;我们使用UIImagePickerController来实现单张图片选择或启动相机拍照。整个拍照过程由UIImagePickerController内部实现&#xff0c;无需我们关心细节&#xff0c;只…

codeforces 118 div2(a,b,c)

好像很久没有写整场比赛的题解了哈…补一场 &#xff08;1900分的d谁会啊…&#xff09; 这个 a , b a,b a,b挺有意思的&#xff0c; c c c就是一个裸的二分 比赛题目链接 A 题目大意 给定两个数的描述&#xff0c;请你比较两个数的大小关系&#xff0c;每个数的描述为&…

【分布式微服务专题】SpringSecurity快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、Spring Security介绍1.1 什么是Spring Security1.2 它是干什么的1.3 Spring Security和Shiro比较 二、快速开始2.1 用户认证2.1.1 设置用户名2.1.1.1 基于application.yml配置文件2.1.1.2 基于Java Config配置方式 2.1.2 设置加密…

IBM介绍?

IBM&#xff0c;全名国际商业机器公司&#xff08;International Business Machines Corporation&#xff09;&#xff0c;是一家全球知名的美国科技公司。它成立于1911年&#xff0c;总部位于美国纽约州阿蒙克市&#xff08;Armonk&#xff09;&#xff0c;是世界上最大的信息…

Python与ArcGIS系列(十八)GDAL之gdb转shp

目录 0 简述1 GDB(Geodatabase)2 MDB(Microsoft Access Database)3 GDB转shp0 简述 MDB和GDB数据格式分别是微软Access数据库文件格式(MDB)和Esri文件地理数据库格式(GDB)。这两种格式都被广泛用于存储和管理地理空间数据。而Shp格式是GIS中的一种重要的图层数据格式,…

一起学Elasticsearch系列-Query DSL

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 查询上下文相关度评分&#xff1a;scoreTF/IDF & BM25 源数据&#xff1a;source 源数据过滤全文检索match&#xff1a;匹配包含某个term的子句match_all&…

[Vulnhub靶机] DriftingBlues: 1

[Vulnhub靶机] DriftingBlues: 1靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues.ova 靶机地址&#xff1a;192.168.67.20 攻击机地址&#xff1a;192.168.67.3 一、信息收集 1.使…

感染了后缀为.DevicData-D-XXXXXXXX勒索病毒如何应对?数据能够恢复吗?

引言: 在数字时代&#xff0c;我们每个人都需要成为网络安全的守护者。通过了解DevicData-D-XXXXXXXX勒索病毒的特征、采取预防措施并了解数据恢复的方法&#xff0c;我们可以更好地保护自己的数据免受这类威胁的侵害。数据的重要性不容小觑&#xff0c;您可添加我们的技术服务…

mysql中按字段1去重,按字段2降序排序

数据举例 sql语句 按字段field4降序排序&#xff0c;按字段field1去重 SELECT tt1.name2,tt1.field1,tt1.field2,tt1.field4 from ( select tt2.name2,tt2.field1,tt2.field2,tt2.field4 from t2 tt2 ORDER BY tt2.field4 DESC ) tt1 GROUP BY tt1.field1执行结果

mysql的索引原理

目录 一、索引采用B树的优势二、为什么不使用其他数据结构2.1、哈希索引2.2平衡二叉树B树 参考 mysql索引采用B树 一、索引采用B树的优势 1可以进行范围查找&#xff0c;通过单向链表解决&#xff08;通过单向链表已经排好序&#xff09;。 2非叶子结点只存储key&#xff0c;不…

vue-vant组件库

组件库&#xff1a;第三方封装好了很多很多的组件&#xff0c;整合到一起就是一个组件库。 官网&#xff1a;Vant 2 - Mobile UI Components built on Vue vant支持vue2&#xff0c;也支持vue3&#xff1b;vant2支持vue2&#xff0c;vant3、vant4支持vue3 分类 vue的组件库…

老胡的周刊(第122期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 movie-web[2] 开源可自部署的简约在线电影搜…