守卫的使用套路
定义守卫
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; }
}
}