NestJS中的守卫-常用于实现授权的Guard

介绍守卫

守卫有单一的责任。它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否将由路由处理程序处理。这通常称为授权。授权(及其通常与之合作的身份验证)通常由传统 Express 应用中的 中间件 处理。中间件是身份验证的不错选择,因为诸如令牌验证和将属性附加到 request 对象之类的事情与特定路由上下文(及其元数据)没有紧密联系。

在Express开发中,我们会使用中间件的方式来实现鉴权。举个例子,在Express应用中,我们会开发一个叫做auth.middleware的文件,并且让每一个进入的http请求都走一遍这个中间件。 在这个中间件中,我们会实现鉴权操作。比如token是否过期、丢失等情况,如果鉴权成功,就可以继续下一步操作。

而在NestJS开发中,由于守卫的出现,我们不再使用中间件的方式, 因为我们觉得这两个是马牛不相及的,所以我们会放在守卫中执行,因为守卫是可以全局的。

配置守卫

当你使用了nest/cli创建项目的时候,可以使用下面的指令创建守卫

javascript 复制代码
 nest g guard guards/auth

由于该守卫的作用是校验token的,所以就称之为auth,且创建之后的地址为src/guards/auth

守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。

初始化的文件内容如下

javascript 复制代码
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
​
@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    return true;
  }
}

我们的AuthGuard 类实现了CanActivate 接口,在canActivate方法中,我们通过一系列的判断,最终返回ture/false,来决定是否继续下一步操作​。 下面的代码,获取到了请求,并且将路径打印出来。

javascript 复制代码
  const request = context.switchToHttp().getRequest();
    console.log('request==================>');
    console.log(request.url);
    //return true means continue
    return true;

绑定守卫​

与管道和异常过滤器一样,守卫可以是控制器范围、方法范围或全局作用域。

守卫的作用域可以作用在全局范围,比如我们所说的鉴权,或者是对某一个特定的控制类或者是控制类的方法中做判断,由于守卫的权限比较高,即

守卫在所有中间件之后、任何拦截器或管道之前执行。​

所以我们可以在该守卫中做一些对请求的预先处理,比如解析token,判断是否过期等。

绑定守卫使用的是@UseGuards()方法。​

下面的例子中,在全局绑定了一个守卫。

javascript 复制代码
async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.useGlobalGuards(new AuthGuard());
  //ejs
  app.setBaseViewsDir('views');
  app.setViewEngine('ejs');
​
  await app.listen(3000);
}
bootstrap();
​

此时,对于整个应用下的http请求,都会经过我们的守卫。

但是,很多时候我们并不想将我们的守卫设置在全局,而只是作为某一个控制类的时候,我们可以这么使用它​

javascript 复制代码
@Controller('list')
@UseGuards(new AuthGuard())
export class ListController {}

上述代码表示该守卫只在该控制类中执行。

公众号链接

大佬们好~求关注​

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学6 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端