NestJs中的守卫(guards)概念

  • 文档:https://docs.nestjs.com/guards
  • 守卫是一个使用 @Injectable()装饰器装饰的类,并且实现了CanActivate接口
  • 是一个类似于中间件的类,以前在KOA和EGG中,我们的权限判断都是在中间件中处理的
  • 其实中间件是比较笨拙的,它并不知道调用next()后会执行哪些处理程序
  • 在Nestjs中提供了守卫来作为一项主要职能,去确定请求是否应该由当前路由处理程序处理
  • 守卫可以访问 ExecutionContext 对象,依次可以知道确切要执行什么
  • 当然,如果用中间件来处理的时候也可以完成

创建和使用守卫

  • $ nest g guard auth

    // src/guard/auth.guard.ts
    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> {// 在这里可以写一些你要的代码 TODOreturn true; // 注意这里 true 和 false}
    }
    
  • 在上述代码中,如果返回true,则可以访问程序,如果false则无法访问
  • 创建好守卫后,可以全局配置,可以在模块中配置

1 ) 下面我们在 admin模块的 user 控制器中使用守卫

import { Controller, Get, UseGuards } from '@nestjs/common';
import { UserService } from '../../service/user/user.service'
import { AppService  } from 'src/app.service';
import { BaseService } from 'src/module/common/service/base/base.service';
import { AuthGuard } from 'src/guard/auth.guard';@Controller('admin/user')
// @UseGuards(AuthGuard) // 在这里写说明整个控制器会被控制
export class UserController {constructor(private userService:UserService,private appService:AppService,private baseService:BaseService,) {}@Get()index() {const list = this.userService.getUser()console.log('list', list)console.log(this.appService.getHello())console.log(this.baseService.getList())return '我是admin模块里的user控制器';}@Get('add')add() {return '我是admin模块里的user/add控制器';}@Get('edit')@UseGuards(AuthGuard) // 在这里写只会控制这个方法、edit() {return '我是admin模块里的user/edit控制器';}
}
  • 从上面代码中可以看到,可以在全部控制器中使用,也可以在控制器中某个方法使用

2 ) 全局使用守卫

  • 在根模块中配置

    import { Module } from '@nestjs/common';
    import { APP_GUARD } from '@nestjs/core';@Module({providers: [{provide: APP_GUARD,useClass: RolesGuard,},],
    })
    export class AppModule {}
    
  • 在main.ts中配置

    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import { AuthGuard } from 'src/guard/auth.guard';async function bootstrap() {const app = await NestFactory.create(AppModule);app.useGlobalGuards(new AuthGuard()) // 全局守卫配置await app.listen(3000);
    }
    bootstrap();
    

在守卫中基于Session实现基于用户权限判断

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> {const req = context.switchToHttp().getRequest() // 这个就相当于中间件中的requestconsole.log(req) // TODO 你想要做的事情return true;}
}

Nestjs中的守卫相关推荐

  1. scala中循环守卫_Scala中的循环

    scala中循环守卫 Scala中的循环 (Loops in Scala) In programming, many times a condition comes when we need to e ...

  2. Nestjs中使用ElasticSearch操作数据

    本人根据github上提供的案例中文分词地址,带大家用页面方式来操作,如果你还没配置好环境,可以参考我之前写的文章连接地址 一.基本使用 1.启动docker容器 2.浏览器中输入http://loc ...

  3. NestJS 中,@ 符号是有什么含义

    在 NestJS 中,@ 符号通常用于装饰器(decorators),这是一种特殊的语法,用于向类.方法或 属性添加元数据.装饰器可以用于许多不同的用途,例如定义控制器.路由.中间件.管道.拦截器等. ...

  4. vue-router 中导航守卫问题

    导航守卫 一开始我以为导航守卫是要在写在main.js中,然后看了网上很多代码,发现这块是可以单独写成一个xxx.js文件,然后在main.js中引入进来,这样就是一个全局引入.当然在xxx.js中, ...

  5. nestjs中生成uuid

    nodejs中有一个uuid的生成库uuid:https://www.npmjs.com/package/uuid,使用起来非常简单. 快速开始 要创建随机UUID,可以使用npm或者yarn安装uu ...

  6. angular7中路由守卫

    路由守卫的作用,在做登录等权限验证的时候,需要用到路由守卫,辅助进行验证. 比如:使用angular做的是单页应用,如果不用任何权限控制的话,就算使用了用户登录功能,假如我们需求是当用户登录成功之后才 ...

  7. Nestjs中控制器和路由的配置使用

    关于Nest控制器 1 ) 控制器的作用 Nest中的控制器层负责处理传入的请求, 并返回对客户端的响应 控制器的目的是接收应用的特定请求.路由机制控制哪个控制器接收哪些请求 通常,每个控制器有多个路 ...

  8. Vue中路由守卫的具体应用

    目录

  9. 面向切面编程实现Nestjs接口Api数据缓存

    一.业务场景 在后端接口开发过程中,我们经常会谈论的话题,提高接口响应速度,前端接口调用后端接口响应时间的缩短,我们抛开数据库设计及后端代码的业务逻辑等问题.我们经常会听到说用redis做数据缓存,直 ...

最新文章

  1. SpringBoot之CommandLineRunner,预先加载系统数据
  2. android 视频播放滤镜,用openGL ES+MediaPlayer 渲染播放视频+滤镜效果
  3. Android开发六 电话拔号器
  4. [ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了
  5. jvm(13)-线程安全与锁优化
  6. 出现画面抖动_连续抖动20小时!虎门大桥桥面如波浪翻滚,专家:个人感觉没问题...
  7. Ibatis ISqlMapper工厂类案例
  8. 基于Android的人事管理系统开发与设计源码(二)
  9. PADS 设置挖空区域,为板子做固定孔,再设置禁止区域,铺铜之前必做的一步...
  10. apicloud 微信授权在AppLoader中 包名不一致
  11. 密度泛函理论平面波基组展开
  12. Java医院管理系统完整代码_医院管理系统(JAVA代码)
  13. 基于HTML5的电子病历编辑方法及系统与流程
  14. php 405错误怎样重现,phpmyadmin出现405错误怎么办?
  15. 页面向左移动动画html,jQuery仿左右窗帘拉开页面动画特效
  16. 无线网络攻防实战 WEP密钥如何被攻破的 图
  17. 2011年2月14日 业界新闻摘要
  18. 收款机收银机测试流程
  19. 电脑网络连接显示DNS服务器未响应,电脑链接网络提示DNS服务器未响应的解决方法(收藏)...
  20. 关于cache miss和prefetch miss的实验

热门文章

  1. 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
  2. macOS 13 如何更新?macOS Ventura抢先更新
  3. 微信小程序-如何引入地图组件及显示当前所在位置
  4. Python学习笔记——函数式方程
  5. git push报错 protocol error: bad line length character: Acti
  6. PS 滤镜——旋转模糊
  7. 数字图像信号-灰度内插
  8. 【五一创作】(2017NHOI-GOC测评)第1题 鱼形(fish)
  9. 嵌入式linux开发笔记——Ubuntu的使用
  10. js读Json,JSON与字符串转化,Java读JSON