简单学习Nest 6 第五篇

第五篇 守卫 今天我们一起学习一下nest中的守卫Guard,通过守卫我们可以将代码里的认证、权限部分进行进行分离,这样我们的代码就有了非常好的维护性。 生成守卫 现在我们就将昨天的密码认证这块进行分离到守卫。 我们使用nest g gu <守卫名称> [创建到的位置]来创建一个守卫.如:nest g gu auth common/guard 我们将auth这个守卫创建到src/common/guard里. 使用守卫 │ app.module.ts │ main.ts │ ├─auth │ auth.controller.ts │ auth.module.ts │ auth.service.ts │ ├─common │ └─guard │ auth.guard.ts │ ├─dbs │ dbs.module.ts │ dbs.service.ts │ └─user user.controller.ts user.module.ts user.service.ts 在创建的过程中可能会产生一个.spec.ts的文件,这个文件是测试单元文件,暂时可以不用管他,删掉就行。 现在我们打开auth.guard.ts进行封装 import { AuthService } from './../../auth/auth.service'; import { CanActivate, ExecutionContext, Injectable, Inject } from '@nestjs/common'; @Injectable() //所有需要在其他类中使用的类都需要使用Injectable,来标识一下 export class AuthGuard implements CanActivate { // 每一个自定义守卫都需要继承CanActivate,这样Nest才可以自动帮你执行下面这个方法canActivate @Inject() private authService: AuthService; // 注入authService canActivate (context: ExecutionContext): boolean { // context是一个执行上下文,什么是执行上下文,你可以理解为当前请求所带这一个临时的空间 // 通过这个空间我们可以获取到一些变量 const http: any = context.switchToHttp(); // 切换当前http上下文 const req = http.getRequest(); // 获取req对象,这个和express的req一样 req.user = this.authService.login(req.body.username, req.body.password); // 这里进行调用authService的login return true; //这里返回false就表示认证失败 } } 接下来我们使用这个定义好的Guard import { AuthGuard } from './../common/guard/auth.guard'; import { AuthService } from './auth.service'; import { Controller, Post, Body, Inject, UseGuards, Req } from '@nestjs/common'; interface LoginDto { username: string; password: string; } @Controller('auth') export class AuthController { @Inject() private authService: AuthService; @Post('login') @UseGuards(AuthGuard) //如你所愿使用非常的easy login (@Body() dto: LoginDto, @Req() req) { // 我们通过req.user,就可以获取到查询到的用户 return req.user; } } 今天的守卫就到这里吧,明天使用自定义的装饰器对这个项目继续进行封装,实现更强大的权限控制的功能。 该项目的所有代码我已经发布到Git上了,地址:https://github.com/holleworldabc/nest-helloworld 最后关注、点赞、收藏,每天都会更新新的文章。 ByBy咱们明天见。

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):