Nestjs中的守卫
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中的守卫相关推荐
- scala中循环守卫_Scala中的循环
scala中循环守卫 Scala中的循环 (Loops in Scala) In programming, many times a condition comes when we need to e ...
- Nestjs中使用ElasticSearch操作数据
本人根据github上提供的案例中文分词地址,带大家用页面方式来操作,如果你还没配置好环境,可以参考我之前写的文章连接地址 一.基本使用 1.启动docker容器 2.浏览器中输入http://loc ...
- NestJS 中,@ 符号是有什么含义
在 NestJS 中,@ 符号通常用于装饰器(decorators),这是一种特殊的语法,用于向类.方法或 属性添加元数据.装饰器可以用于许多不同的用途,例如定义控制器.路由.中间件.管道.拦截器等. ...
- vue-router 中导航守卫问题
导航守卫 一开始我以为导航守卫是要在写在main.js中,然后看了网上很多代码,发现这块是可以单独写成一个xxx.js文件,然后在main.js中引入进来,这样就是一个全局引入.当然在xxx.js中, ...
- nestjs中生成uuid
nodejs中有一个uuid的生成库uuid:https://www.npmjs.com/package/uuid,使用起来非常简单. 快速开始 要创建随机UUID,可以使用npm或者yarn安装uu ...
- angular7中路由守卫
路由守卫的作用,在做登录等权限验证的时候,需要用到路由守卫,辅助进行验证. 比如:使用angular做的是单页应用,如果不用任何权限控制的话,就算使用了用户登录功能,假如我们需求是当用户登录成功之后才 ...
- Nestjs中控制器和路由的配置使用
关于Nest控制器 1 ) 控制器的作用 Nest中的控制器层负责处理传入的请求, 并返回对客户端的响应 控制器的目的是接收应用的特定请求.路由机制控制哪个控制器接收哪些请求 通常,每个控制器有多个路 ...
- Vue中路由守卫的具体应用
目录
- 面向切面编程实现Nestjs接口Api数据缓存
一.业务场景 在后端接口开发过程中,我们经常会谈论的话题,提高接口响应速度,前端接口调用后端接口响应时间的缩短,我们抛开数据库设计及后端代码的业务逻辑等问题.我们经常会听到说用redis做数据缓存,直 ...
最新文章
- SpringBoot之CommandLineRunner,预先加载系统数据
- android 视频播放滤镜,用openGL ES+MediaPlayer 渲染播放视频+滤镜效果
- Android开发六 电话拔号器
- [ASP.NET Core 2.0 前方速报].NET Core 2.0.3 已经支持引用第三方程序集了
- jvm(13)-线程安全与锁优化
- 出现画面抖动_连续抖动20小时!虎门大桥桥面如波浪翻滚,专家:个人感觉没问题...
- Ibatis ISqlMapper工厂类案例
- 基于Android的人事管理系统开发与设计源码(二)
- PADS 设置挖空区域,为板子做固定孔,再设置禁止区域,铺铜之前必做的一步...
- apicloud 微信授权在AppLoader中 包名不一致
- 密度泛函理论平面波基组展开
- Java医院管理系统完整代码_医院管理系统(JAVA代码)
- 基于HTML5的电子病历编辑方法及系统与流程
- php 405错误怎样重现,phpmyadmin出现405错误怎么办?
- 页面向左移动动画html,jQuery仿左右窗帘拉开页面动画特效
- 无线网络攻防实战 WEP密钥如何被攻破的 图
- 2011年2月14日 业界新闻摘要
- 收款机收银机测试流程
- 电脑网络连接显示DNS服务器未响应,电脑链接网络提示DNS服务器未响应的解决方法(收藏)...
- 关于cache miss和prefetch miss的实验
热门文章
- 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
- macOS 13 如何更新?macOS Ventura抢先更新
- 微信小程序-如何引入地图组件及显示当前所在位置
- Python学习笔记——函数式方程
- git push报错 protocol error: bad line length character: Acti
- PS 滤镜——旋转模糊
- 数字图像信号-灰度内插
- 【五一创作】(2017NHOI-GOC测评)第1题 鱼形(fish)
- 嵌入式linux开发笔记——Ubuntu的使用
- js读Json,JSON与字符串转化,Java读JSON