nestjs的守卫是什么东西

276 阅读1分钟

守卫的使用套路

定义守卫
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
@Injectable() 
export class RolesGuard implements CanActivate { 
    canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { 
        //我们得到了context  
        在这里逻辑判断  比如context.req.user 得到这个判断有咩有权限
        
        
        
        return true; //true就是成功 false 会有一个异常403返回
    }
 }

使用

@UseGuards(RolesGuard)
@controller()
class controlelr{

    @UseGuards(RolesGuard)
    @GET()
    TESTGUARD(){
        //测试路由守卫啊
    }
}

RolesGuard可以 类 或者方法上


进阶继续

    @UseGuards(RolesGuard)
    @GET()
+   @Roles('admin')
    TESTGUARD(){
        //测试路由守卫啊
    }

我们需要告诉RolesGuard我们需要操作的是admin权限的操作 也就是把admin传递给路由守卫?如何做?

1.自定义注解
2.在 class RolesGuard implements CanActivate 能获取到这个@Roles和他的参数admin

1.新的东西 
import{SetMetadata} from 'nestjs/common'
export const Roles =(...str:string[])=>SetMetadata('roles',str)
就这样定义了@Roles('xxx')的注解了

2.class RolesGuard implements CanActivate{
    import { Reflector } from '@nestjs/core';
    使用新的东西  注入反射操作帮助类
   constructor(private reflector: Reflector) {}
   
   canActive(context:ExecutionContext){
    const roles = this.reflector.get<string[]>(
    'roles',context.getHandler()); 
    if (!roles) { return true; }
   }
}