简单学习Nest 6 第五篇
2020-02-17 本文已影响0人
爱写Bug的程序猿
第五篇 守卫
今天我们一起学习一下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咱们明天见。