小满nestjs(第二十一章 nestjs 守卫)

简介: 守卫有一个单独的责任。它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。这通常称为授权。在传统的 Express 应用程序中,通常由中间件处理授权(以及认证)。中间件是身份验证的良好选择,因为诸如 token 验证或添加属性到 request 对象上与特定路由(及其元数据)没有强关联。

守卫(guard)


守卫有一个单独的责任。它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。这通常称为授权。在传统的 Express 应用程序中,通常由中间件处理授权(以及认证)。中间件是身份验证的良好选择,因为诸如 token 验证或添加属性到 request 对象上与特定路由(及其元数据)没有强关联。


tips 守卫在每个中间件之后执行,但在任何拦截器或管道之前执行。

创建一个守卫


nest g gu [name]


ef79e89690b84f46941b5489964de0c1.png


守卫要求实现函数  给定参数context执行上下文 要求返回布尔值


a49d71961d394ae585d4b49adccc9428.png


Controller 使用守卫

使用UseGuards  控制守卫


1e9b509cef964854bc577bbdd7382aef.png

import { Controller, Get, Post, Body, Patch, Param, Delete ,UseGuards} from '@nestjs/common'; 
@Controller('guard')
@UseGuards(RoleGuard)
xxxxx


全局守卫


app.useGlobalGuards(new RoleGuard())

9c95a0eb42af4b2995e64ea85942c8f0.png


针对角色控制守卫


SetMetadata 装饰器


第一个参数为key,第二个参数自定义我们的例子是数组存放的权限


566d426f4b7445beb1c12d1ec3dd4292.png


guard  使用  Reflector 反射读取 setMetaData的值 去做判断这边例子是从url 判断有没有admin权限


import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core'
import type { Request } from 'express'
@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private Reflector: Reflector) { }
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const admin = this.Reflector.get<string[]>('role', context.getHandler())
    const request = context.switchToHttp().getRequest<Request>()
    if (admin.includes(request.query.role as string)) {
      return true;
    }else{
      return false
    }
  }
}


成功的  


c70c667130ab42a38c04de4739a92ce1.png


失败的


bb6d9e8061e244ab966bdc7c4d248c71.png

目录
相关文章
|
7月前
|
数据库
小满nestjs(第二十八章 nestjs 事务)
小满nestjs(第二十八章 nestjs 事务)
225 0
小满nestjs(第二十八章 nestjs 事务)
|
前端开发
小满nestjs(第十章 nestjs 提供者)
如果服务 之间有相互的依赖 或者逻辑处理 可以使用 useFactory
189 0
小满nestjs(第十章 nestjs 提供者)
|
中间件
小满nestjs(第十二章 nestjs 中间件)
中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象
236 4
小满nestjs(第十二章 nestjs 中间件)
|
JavaScript API
小满nestjs(第十五章 nestjs 和 RxJs)
nterval 五百毫秒执行一次 pipe 就是管道的意思 管道里面也是可以去掉接口的支持处理异步数据 去处理数据 这儿展示 了 map 和 filter 跟数组的方法是一样的 最后 通过观察者 subscribe 接受回调
145 0
小满nestjs(第十五章 nestjs 和 RxJs)
小满nestjs(第十一章 nestjs 模块)
每个 Nest 应用程序至少有一个模块,即根模块。根模块是 Nest 开始安排应用程序树的地方。事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。在大多数情况下,您将拥有多个模块,每个模块都有一组紧密相关的功能
138 0
小满nestjs(第十一章 nestjs 模块)
|
前端开发
小满nestjs(第九章 nestjs Session)
session 是服务器 为每个用户的浏览器创建的一个会话对象 这个session 会记录到 浏览器的 cookie 用来区分用户
330 0
小满nestjs(第九章 nestjs Session)
|
前端开发 测试技术 API
小满nestjs(第八章 nestjs 控制器)
小满nestjs(第八章 nestjs 控制器)
205 0
小满nestjs(第八章 nestjs 控制器)
小满nestjs(第十七章 nestjs 异常拦截器)
让我们创建一个异常过滤器,它负责捕获作为HttpException类实例的异常,并为它们设置自定义响应逻辑。为此,我们需要访问底层平台 Request和 Response。我们将访问Request对象,以便提取原始 url并将其包含在日志信息中。我们将使用 Response.json()方法,使用 Response对象直接控制发送的响应。
151 0
小满nestjs(第十七章 nestjs 异常拦截器)
|
前端开发 数据库
小满nestjs(第十四章 nestjs 下载图片)
小满nestjs(第十四章 nestjs 下载图片)
228 0
小满nestjs(第十四章 nestjs 下载图片)
|
开发框架 JSON JavaScript
小满nestjs(第一章 介绍nestjs)
Nestjs 是一个用于构建高效可扩展的一个基于Node js 服务端 应用程序开发框架并且完全支持typeScript 结合了 AOP 面向切面的编程方式
229 0
小满nestjs(第一章 介绍nestjs)
下一篇
DataWorks