Skip to content

接口在返回一些敏感或隐私数据时,是需要进行脱敏处理,通常的手段是使用 * 隐藏一部分数据。例如:

类型原始数据脱敏数据
姓名(userName)张三张*
密码(password)123456******
手机(phone)15888888888158****8888
邮箱(email)vivy@qq.comv****@qq.com
身份证(idCard)4306021988121366664306** ****** **6666
银行卡(bankCard)6211222200008888666**** **** **** 8666

使用

基于 序列化 功能实现。

在字段上添加 @Sensitive 脱敏装饰器。

ts
import { Sensitive, DesensitizedUtils } from '@vivy-common/core'

export class UserEntity {
  @Sensitive(DesensitizedUtils.phone)
  phone: string
}

在控制器上添加 ClassSerializerInterceptor 拦截器。

ts
import { ClassSerializerInterceptor, UseInterceptors } from '@nestjs/common'
import { AjaxResult } from '@vivy-common/core'
import { UserEntity } from './entities/user.entity'

@Controller()
export class UserController {
  @Get()
  @UseInterceptors(ClassSerializerInterceptor)
  info() {
    const user = new UserEntity()
    user.phone = '18688888888'
    return AjaxResult.success(user)
  }
}

在响应结果中即可实现数据脱敏。

json
{
  "data": {
    "phone": "186****8888"
  }
}

手动实例化

由于 序列化 的限制,必须返回实例。如果你的数据时一个普通对象可以使用 class-transformer 的转换方法。

ts
import { ClassSerializerInterceptor, UseInterceptors } from '@nestjs/common'
import { AjaxResult } from '@vivy-common/core'
import { plainToInstance } from 'class-transformer'
import { UserEntity } from './entities/user.entity'

@Controller()
export class UserController {
  @Get()
  @UseInterceptors(ClassSerializerInterceptor)
  info() {
    const user = {
      phone: '18688888888',
    }
    const userInstance = plainToInstance(UserEntity, user)
    return AjaxResult.success(userInstance)
  }
}

在响应结果中即可实现数据脱敏。

json
{
  "data": {
    "phone": "186****8888"
  }
}

相关源码