From b0e2a0086aa00c7177299eb90ec824d73c13a661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=BB=E6=AC=A2?= Date: Fri, 26 Aug 2022 10:50:38 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E4=BB=A3=E7=A0=81=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 24 ++++++++++++++++++++---- rule.go | 2 +- run_test.go | 13 +++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/readme.md b/readme.md index 9034960..a3cfe25 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,12 @@ -## 脱敏 +## 脱敏 Desensitization -### 作用 +### 作用 Effect 利用反射处理结构体,处理带`sen`标签的字段(规则: `规则名称,占位符`,如:`phone,*`),将其脱敏。支持自定义处理函数 -### 定义结构体示例 +Use reflection to process the structure, process the fields with the `sen` tag (rule: `rule name, placeholder`, such as: `phone,*`), and desensitize it. Support custom handlers + + +### 定义结构体示例 Example ```go package main @@ -16,17 +19,30 @@ type User struct { Name string `json:"name"` Age int `json:"age"` Phone string `json:"phone" sen:"phone,*"` + Email string `json:"email" sen:"email,*"` } data := User{ Name: "lixh", Age: 18, Phone: "13888888888", + Email: "lixh@gmail.com", } +// 添加自定义处理函数 +// Add custom handler +sensitive.AddHandler("email", func(src, p string) string { + // 将@符号后面的替换为* + // Replace the after @ sign with * + idx := strings.Index(src, "@") + dst := src[:idx+1] + strings.Repeat(p, utf8.RuneCountInString(src)-idx-1) + + return dst +}) + if err := sensitive.Desensitize(data); err != nil { fmt.Println(err) } bs, _ := json.Marshal(response) -log.Printf("脱敏后的数据: %v", string(bs)) +log.Printf("after processing data: %v", string(bs)) ``` \ No newline at end of file diff --git a/rule.go b/rule.go index b02a2c4..4ee4c19 100644 --- a/rule.go +++ b/rule.go @@ -1,6 +1,6 @@ package sensitive -import "sensitive/handle" +import "github.com/lixh00/sensitive/handle" // RuleHandler 脱敏规则处理接口 type RuleHandler func(src, placeholder string) (dst string) diff --git a/run_test.go b/run_test.go index be1884f..1427602 100644 --- a/run_test.go +++ b/run_test.go @@ -4,7 +4,9 @@ import ( "encoding/json" "log" "net/http" + "strings" "testing" + "unicode/utf8" ) // Response 返回值 @@ -29,6 +31,7 @@ type Data struct { Name string `json:"name"` Phone string `json:"phone" sen:"phone,*"` // 使用脱敏标签,规则为手机号,替换占位字符为* IdNumber string `json:"idNumber" sen:"idNumber,#"` // 使用脱敏标签,规则为身份证号码,替换占位字符为* + Email string `json:"email" sen:"email,*"` // 使用脱敏标签,规则为邮箱,替换占位字符为* } // 模拟测试一下 @@ -38,11 +41,13 @@ func TestDeal(t *testing.T) { Name: "张三", Phone: "13800138000", IdNumber: "420102199010101010", + Email: "zhangsan@gmail.com", }, { Id: "234", Name: "李四", Phone: "13800138001", IdNumber: "420102199010101011", + Email: "lisi@gmail.com", }} pageData := PageData{ @@ -69,6 +74,14 @@ func TestDeal(t *testing.T) { //bs, _ = json.Marshal(response) //log.Printf("假设是管理员,需要跳过处理,脱敏后的数据: %v", string(bs)) + AddHandler("email", func(src, p string) string { + // 将@符号后面的替换为* + idx := strings.Index(src, "@") + dst := src[:idx+1] + strings.Repeat(p, utf8.RuneCountInString(src)-idx-1) + + return dst + }) + if err := Desensitization(response, false); err != nil { log.Println(err) }