Nest.js

简单学习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咱们明天见。

上一篇下一篇

猜你喜欢

热点阅读