Skip to content

Commit

Permalink
补充脱敏
Browse files Browse the repository at this point in the history
  • Loading branch information
yumaojun03 committed Jun 10, 2024
1 parent 11df3ae commit 7b22985
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 29 deletions.
26 changes: 26 additions & 0 deletions desense/default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,41 @@ func TestDeSense(t *testing.T) {
}

type TestMaskStuct struct {
Name string `json:"name"`
PhoneNumber string `json:"phone_number" mask:",5,4"`
}

func TestMusk(t *testing.T) {
tm := &TestMaskStuct{
PhoneNumber: "1234567890123",
Name: "test",
}

if err := desense.MaskStruct(tm); err != nil {
t.Fatal(err)
}
t.Log(tm.PhoneNumber)
t.Log(tm.Name)
}

var set = &TestMaskStuctSet{
Items: []*TestMaskStuct{
{
PhoneNumber: "1234567890123",
},
},
}

type TestMaskStuctSet struct {
Items []*TestMaskStuct `json:"items"`
}

func TestMuskSet(t *testing.T) {
if err := desense.MaskStruct(set); err != nil {
t.Fatal(err)
}

for _, v := range set.Items {
t.Log(v.PhoneNumber)
}
}
64 changes: 35 additions & 29 deletions desense/desense.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,40 +13,46 @@ func MaskStruct(s any) error {
}

v := reflect.ValueOf(s).Elem()
typ := v.Type()
t := v.Type()

for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
tag := typ.Field(i).Tag.Get("mask")

muskLine := strings.Split(tag, ",")
desensorName := "default"
if len(muskLine) > 0 {
dn := muskLine[0]
if dn != "" {
desensorName = dn
fieldValue := v.Field(i)
switch fieldValue.Kind() {
case reflect.Slice:
for i := 0; i < fieldValue.Len(); i++ {
MaskStruct(fieldValue.Index(i).Interface())
}
}
desensorParam := []string{}
if len(muskLine) > 1 {
desensorParam = muskLine[1:]
}

desenfor := Get(desensorName)
if desenfor == nil {
return fmt.Errorf("desenfor %s not found", desensorName)
}

if field.Kind() == reflect.Struct {
MaskStruct(field.Addr().Interface())
} else {
fieldValue := v.Field(i).Interface()
if vStr, ok := fieldValue.(string); ok {
field.SetString(desenfor.DeSense(vStr, desensorParam...))
case reflect.Struct:
MaskStruct(fieldValue.Addr().Interface())
default:
tag := t.Field(i).Tag.Get("mask")
if tag == "" {
continue
}
name, args := ParseStructTag(tag)
desenfor := Get(name)
if desenfor == nil {
return fmt.Errorf("desenfor %s not found", name)
}
if vStr, ok := fieldValue.Interface().(string); ok {
fieldValue.SetString(desenfor.DeSense(vStr, args...))
}
}

}

return nil
}

func ParseStructTag(v string) (name string, args []string) {
muskLine := strings.Split(v, ",")
name = "default"
if len(muskLine) > 0 {
dn := muskLine[0]
if dn != "" {
name = dn
}
}
if len(muskLine) > 1 {
args = muskLine[1:]
}
return
}

0 comments on commit 7b22985

Please sign in to comment.