commit
5f650fe975
@ -0,0 +1,6 @@
|
||||
.idea
|
||||
vendor
|
||||
logs
|
||||
cache
|
||||
log
|
||||
config.yaml
|
@ -0,0 +1,17 @@
|
||||
package handle
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
// IdCard
|
||||
// @description: 脱敏规则: 身份证号码
|
||||
// @param src string: 待处理字符串
|
||||
// @param placeholder string: 占位符
|
||||
// @return dst string: 脱敏后的数据
|
||||
func IdCard(src, placeholder string) (dst string) {
|
||||
// 保留前六位后两位
|
||||
dst = src[:6] + strings.Repeat(placeholder, utf8.RuneCountInString(src)-7) + src[len(src)-2:]
|
||||
return
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
## 脱敏
|
||||
|
||||
### 作用
|
||||
利用反射处理结构体,处理带`sen`标签的字段(规则: `规则名称,占位符`,如:`phone,*`),将其脱敏。支持自定义处理函数
|
||||
|
||||
### 定义结构体示例
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/lixh00/sensitive"
|
||||
)
|
||||
|
||||
|
||||
type User struct {
|
||||
Name string `json:"name"`
|
||||
Age int `json:"age"`
|
||||
Phone string `json:"phone" sen:"phone,*"`
|
||||
}
|
||||
|
||||
data := User{
|
||||
Name: "lixh",
|
||||
Age: 18,
|
||||
Phone: "13888888888",
|
||||
}
|
||||
|
||||
if err := sensitive.Desensitize(data); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
bs, _ := json.Marshal(response)
|
||||
log.Printf("脱敏后的数据: %v", string(bs))
|
||||
```
|
@ -0,0 +1,23 @@
|
||||
package sensitive
|
||||
|
||||
import "sensitive/handle"
|
||||
|
||||
// RuleHandler 脱敏规则处理接口
|
||||
type RuleHandler func(src, placeholder string) (dst string)
|
||||
|
||||
var senRuleMap map[string]RuleHandler // 脱敏规则Map
|
||||
|
||||
// 初始化函数,初始化默认的脱敏规则
|
||||
func init() {
|
||||
senRuleMap = make(map[string]RuleHandler)
|
||||
AddHandler("phone", handle.Phone)
|
||||
AddHandler("idCard", handle.IdCard)
|
||||
}
|
||||
|
||||
// AddHandler
|
||||
// @description: 添加脱敏规则处理函数
|
||||
// @param name string: 脱敏规则名称
|
||||
// @param handler SensitiveRuleHandler: 脱敏规则处理函数
|
||||
func AddHandler(name string, handler RuleHandler) {
|
||||
senRuleMap[name] = handler
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package sensitive
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Response 返回值
|
||||
type Response struct {
|
||||
Code int `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
Data any `json:"data"`
|
||||
}
|
||||
|
||||
// PageData 分页数据通用结构体
|
||||
type PageData struct {
|
||||
Current int `json:"current"` // 当前页码
|
||||
Size int `json:"size"` // 每页数量
|
||||
Total int64 `json:"total"` // 总数
|
||||
TotalPage int `json:"total_page"` // 总页数
|
||||
Records any `json:"records"` // 返回数据
|
||||
}
|
||||
|
||||
// Data 模拟返回数据结构体
|
||||
type Data struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Phone string `json:"phone" sen:"phone,*"` // 使用脱敏标签,规则为手机号,替换占位字符为*
|
||||
IdNumber string `json:"idNumber" sen:"idNumber,#"` // 使用脱敏标签,规则为身份证号码,替换占位字符为*
|
||||
}
|
||||
|
||||
// 模拟测试一下
|
||||
func TestDeal(t *testing.T) {
|
||||
data := []Data{{
|
||||
Id: "123",
|
||||
Name: "张三",
|
||||
Phone: "13800138000",
|
||||
IdNumber: "420102199010101010",
|
||||
}, {
|
||||
Id: "234",
|
||||
Name: "李四",
|
||||
Phone: "13800138001",
|
||||
IdNumber: "420102199010101011",
|
||||
}}
|
||||
|
||||
pageData := PageData{
|
||||
Current: 1,
|
||||
Size: 10,
|
||||
Total: 2,
|
||||
TotalPage: 1,
|
||||
Records: &data,
|
||||
}
|
||||
|
||||
response := Response{
|
||||
Code: http.StatusOK,
|
||||
Msg: "success",
|
||||
Data: pageData,
|
||||
}
|
||||
|
||||
bs, _ := json.Marshal(response)
|
||||
log.Printf("脱敏前的数据: %v", string(bs))
|
||||
|
||||
//if err := response.Desensitization(true); err != nil {
|
||||
// log.Println(err)
|
||||
//}
|
||||
|
||||
//bs, _ = json.Marshal(response)
|
||||
//log.Printf("假设是管理员,需要跳过处理,脱敏后的数据: %v", string(bs))
|
||||
|
||||
if err := Desensitization(response, false); err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
|
||||
bs, _ = json.Marshal(response)
|
||||
log.Printf("脱敏后的数据: %v", string(bs))
|
||||
}
|
Loading…
Reference in new issue