Nestjs自定义注解实现接口权限控制详解

 更新时间:2022年12月05日 17:26:05   作者:solocoder  
这篇文章主要为大家介绍了Nestjs自定义注解实现接口权限控制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

当业务接口开发完成之后,正式上线之前还需要对每个接口进行权限控制。比如删除用户只能管理员角色操作,查询全部用户只有管理员有权限等。

对接口实现权限控制有很多种方案,最简单的实现是在每个接口的 controller 层进行判断,但这样不优雅,冗余代码多,且对业务侵入比较强。合理的权限控制方案应该是跟业务逻辑松耦合。

Nest 官方文档为我们提供了几种权限控制方式,我们来实现最基础的基于角色的 RBAC(Role-based access control) 控制方案。

实现 RBAC 权限控制一共需要五步:

  • 定义角色的枚举类 Role
  • 声明自定义注解(装饰器)roles.decorators.ts
  • 实现角色守卫 RolesGuard
  • 在 app.module.ts 的 providers 中引入 RolesGuard
  • 在需要的接口上添加注解:@Roles(Role.Admin, Role.SuperAdmin)�

定义角色枚举

梳理好系统中一共有多少种角色,并为每种角色确定好 Code,然后声明为枚举类型。这里的角色类型可以自定义,根据业务需要设多少都行。

export enum Role {
  SuperAdmin = 'SuperAdmin',
  Admin = 'Admin',
  Normal = 'Normal',
  Guest = 'Guest',
}

声明自定义注册(装饰器)

新建一个 roles.decorator.ts文件,就可以在 Controller 中使用 @Roles注解了

import { SetMetadata } from '@nestjs/common';
import { Role } from '@constants';
export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

实现角色守卫 RolesGuard

新建 roles.gurad.ts文件,它的作用是告诉 nest 什么情况下请求应该被拦截,什么情况下请求应该被通过。

通过 reflector可以拿到注解中传入的角色 code 列表,通过 context.switchToHttp().getRequest()可以拿到 request 对象。因为我们使用了 jwt,在 JwtStrategy�中往 user 对象中写入了当前登录用户的角色信息,所以可以通过从 request 中取 user 的方式得到角色列表。这块具体的获取方式根据你的业务而定,业务中把角色信息放在了什么地方,就从哪里取。

拿到注解中传入的角色,和用户已有的角色进行对比,如果用户角色中包含需要的角色,则返回 true,如果返回 false,则会抛出默认的异常如下:

{
  "statusCode": 403,
  "message": "Forbidden resource",
  "error": "Forbidden"
}

我们需要定制错误信息,以使整个系统保持一致,则抛出一个自定义异常,这个异常按照统一规定的格式返回错误信息。

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from '../decorators/roles.decorator';
import { Role } from '@constants';
import { InternalErrorException } from '../../exception/InternalErrorException';
import { errorResult } from '@utils';
import { ErrorCodes } from '@constants/errorCode';
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}
  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (!requiredRoles) {
      return true;
    }
    const { user } = context.switchToHttp().getRequest();
    const roleCodes = user.roles?.map((item) => item.code);
    const flag = requiredRoles.some((role) => roleCodes?.includes(role));
    if (!flag) {
      throw new InternalErrorException(errorResult(ErrorCodes.NoAuth));
    }
    return flag;
  }
}

在 providers 中引入 RolesGuard

如果想在全局使用自定义注解,就在 app.module.ts中全局引入。如果仅想在某个 controller 中使用,则在这个 controller 层级的 module 中声明。

providers: [
  {
    provide: APP_GUARD,
    useClass: RolesGuard,
  },
],

使用注解

在接口上使用自定义注解实现权限校验。
括号里可以写一个权限,也可以写多个,因为我们 roles.decorator.ts中写的参数类型为 Role[]

  @Get()
  @Roles(Role.Admin, Role.SuperAdmin)
  async findAll() {
    const users = await this.userService.findAll();
    return successResult(users);
  }

至此,使用自定义注册实现接口权限控制就完成啦。

以上就是Nestjs自定义注解实现接口权限控制详解的详细内容,更多关于Nestjs注解接口权限的资料请关注脚本之家其它相关文章!

相关文章

  • require加载器实现原理的深入理解

    require加载器实现原理的深入理解

    这篇文章主要给大家介绍了关于require加载器实现原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • koa2上传文件及https配置实现教程

    koa2上传文件及https配置实现教程

    这篇文章主要为大家介绍了koa2上传文件及https配置实现教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • node中使用es5/6以及支持性与性能对比

    node中使用es5/6以及支持性与性能对比

    本篇文章主要介绍了node中使用es5/6以及支持性与性能对比,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 在node.js中读写文件的三种方法总结

    在node.js中读写文件的三种方法总结

    nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三个方法,接下来小编就和大家一起来分析一下这三种方法
    2023-09-09
  • Node.js API详解之 console模块用法详解

    Node.js API详解之 console模块用法详解

    这篇文章主要介绍了Node.js API详解之 console模块用法,总结分析了Node.js API中console模块基本函数、使用方法与操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 在Ubuntu系统上安装Ghost博客平台的教程

    在Ubuntu系统上安装Ghost博客平台的教程

    这篇文章主要介绍了在Ubuntu系统上安装Ghost博客平台的教程,Ghost博客平台以Node.js写成,需要的朋友可以参考下
    2015-06-06
  • express框架+bootstrap美化ejs模板实例分析

    express框架+bootstrap美化ejs模板实例分析

    这篇文章主要介绍了express框架+bootstrap美化ejs模板,结合实例形式分析了express框架引入bootstrap结合ejs模版引擎相关操作技巧与注意事项,需要的朋友可以参考下
    2023-05-05
  • package.json各个属性说明详解

    package.json各个属性说明详解

    这篇文章主要介绍了package.json各个属性说明详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • node实现shell命令管理工具及commander.js学习

    node实现shell命令管理工具及commander.js学习

    这篇文章主要为大家介绍了node实现shell命令管理工具及commander.js学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • node schedule实现定时任务的示例代码

    node schedule实现定时任务的示例代码

    实际工作中,可能会遇到定时清除某个文件夹内容,本文主要介绍了node schedule实现定时任务的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08

最新评论