postgresql敏感信息处理

  |  

需求

对手机号 和 邮箱进行脱敏处理

处理方式

使用数据库regexp_replace函数进行数据处理

regexp_replace函数介绍

regexp_replace(source, pattern, replace_string, occurrence)
参数说明:

  1. source: string 类型,要替换的原始字符串。
  2. pattern: string 类型常量,要匹配的正则模式,pattern 为空串时抛异常。
  3. replace_string:string,将匹配的 pattern 替换成的字符串。
  4. occurrence: bigint 类型常量,必须大于等于 0,
    大于 0:表示将第几次匹配替换成 replace_string,
    等于 0:表示替换掉所有的匹配子串。
    其它类型或小于 0 抛异常。

返回值:
将 source 字符串中匹配 pattern 的子串替换成指定字符串后返回,当输入 source, pattern, occurrence 参数为 NULL 时返回 NULL,若 replace_string 为 NULL 且 pattern 有匹配,返回 NULL,replace_string 为 NULL 但 pattern 不匹配,则返回原串。

使用

1
2
3
4
5
6
7
8
const users: User[] = await this.userRepo
.createQueryBuilder()
.select('"id"')
.addSelect("nickname")
.addSelect(`REGEXP_REPLACE(phone, '(^.{3}).*(\\d{4})$', '\\1**\\2')`, "phone") // 格式 +86**4352
.addSelect(`REGEXP_REPLACE(email, '(^.{2}).*@(.*)', '\\1**@\\2')`, "email") // 格式 fe**@qq.com
.where({ id: "c66d2386-bcfb-420d-91be-ca6af07415d2" })
.getRawMany();

生成的 sql

1
SELECT "id", nickname, REGEXP_REPLACE(phone, '(^.{3}).*(\d{4})$', '\1**\2') AS "phone", REGEXP_REPLACE(email, '(^.{2}).*@(.*)', '\1**@\2') AS "email" FROM "user" "User" WHERE ( "User"."id" = 'c66d2386-bcfb-420d-91be-ca6af07415d2' ) AND ( "User"."deleteTime" IS NULL )
文章目录
  1. 1. 需求
  2. 2. 处理方式
  3. 3. regexp_replace函数介绍
  4. 4. 使用