「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
守卫
学习之前的疑问:守卫是干什么?按字面意思守卫,身份的验证吗?只有确认身份了才可放行吗?但是在之前使用的时候,都是由路由处理程序来处理权限,访问控制的,都是通过中间件进行处理授权,完成身份验证。
在 Nest 框架中,守卫都是在每个中间件之后执行的,但在任何拦截器或管道之前执行。使用守卫处理授权的理由是:
- 多个中间件的时候,中间件调用 next() 函数后不知道调用哪个处理程序
- 守卫可以访问 ExecutionContext 实例,知道接下来要执行什么
- 守卫目的是在请求/响应周期的正确位置插入要处理的路基,并以声明的方式进行插入。
所以,守卫的主要功能是授权。
使用
- 守卫是一个使用
@Injectable()装饰器的类。 守卫应该实现CanActivate接口。
- 每个守卫必须实现一个canActivate()函数。此函数应该返回一个布尔值,指示是否允许当前请求。它可以同步或异步地返回响应(通过
Promise或Observable) - 通过返回值来控制下一步行为:若返回 true 将处理用户调用,否则将忽略当前处理的请求
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
throw new Error("Method not implemented.");
}
}
全局守卫
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new AuthGuard()); // 全局守卫
await app.listen(4000);
}
控制器守卫
守卫加在控制器上面,整个控制器下所有的路由或者说所有的方法都需要进行权限判断
@Controller('role')
@UseGuards(AuthGuard) // 控制器上加守卫
export class RoleController {
@Get()
getList() {
return { code: 200, data: 1 }
}
}
方法守卫
守卫加在控制器的具体方法上,使用这个方法都需要进行权限判断
@Controller('role')
export class RoleController {
@Post()
@UseGuards(AuthGuard) // 方法上加守卫
getInfo() {
return {
data: 11
}
}
}
NestJs重学系列整合
\