【NestJS学习笔记】 之 守卫
前言,小编最近在学习NestJS系列相关知识,想把自己了解到的知识点作为笔记的同时也分享给大家,本篇涉及的是与守卫相关的知识,如果有哪里写的不好的话还恳请各位掘友批评指正谢谢,小编将不胜感激,闲话不多说,我们直接步入正题吧...
守卫(Guard)
在 NestJS 中,守卫(Guards)是一种用于处理身份验证和授权的机制。它们是一种特殊的类,实现了 CanActivate 接口,主要用于确定请求是否应该由路由处理程序处理。守卫在每个中间件之后执行,但在任何拦截器或管道之前执行。
以下是关于 NestJS 守卫的关键点:
-
主要功能:
- 身份验证:确定用户是否已登录或有效(即登录信息是否过期)。
- 授权:检查用户是否有权限执行特定操作。
-
工作原理:
- 守卫可以访问 ExecutionContext 实例,因此可以了解当前请求的详细信息。
- 它们返回一个布尔值,指示是否允许当前请求继续。
-
使用场景:
- 保护路由或控制器
- 实现基于角色的访问控制
- 验证 JWT 令牌
- 检查用户权限
创建守卫
// 1. 使用 nest -h 查看命令
nest -h
// 2. 生成一个完整的资源。资源通常包括控制器、服务、模块等相关文件。
nest g res guard //guard为资源名称
// 3. 创建一个守卫,名称为guard
nest g gu guard
守卫要求实现函数canActivate ,并给定参数context执行上下文 要求返回一个布尔值
使用守卫(通过 UseGuards 装饰器)
在 Controller 中使用守卫:
实现全局守卫:
实现针对不同角色控制守卫(鉴权)
guard 使用 Reflector 反射读取 setMetaData的值去做判断这边例子是从url 判断有没有admin权限
借助 SetMetadata 装饰器,第一个参数为key,第二个参数自定义我们的例子是数组存放的权限
鉴权成功时
鉴权失败时
注意:上面的 SetMetadata 传入的第一个参数的名称可以自定义,但是要与守卫中,也就是上面实现了 CanActivate 类的 GuardGuard 中的 this.reflector 的第一个参数名称要一致才可以让特定的守卫生效
结语:以上就是小编对于NestJS中守卫的知识点的理解,感谢阅读!!!
转载自:https://juejin.cn/post/7390646355028967451