Iris框架不内置脱敏能力,需在ctx.JSON()前通过反射遍历结构体标签(如mask:"phone")动态脱敏,支持按角色、来源等条件控制,并建议路由级启用而非全局替换JSON编码器。

Iris 框架本身不内置数据脱敏能力,它是一个 Go 语言的高性能 Web 框架(类似 gin 或 echo),职责是路由、中间件、请求响应处理——脱敏逻辑必须由开发者显式注入。
你真正要问的是:在用 Iris 构建 API 时,如何对返回给前端的敏感字段做实时脱敏?
iris.Context 响应前拦截并脱敏结构体字段
Iris 的核心是 Context,所有响应都经由 ctx.JSON()、ctx.XML() 等方法发出。脱敏最自然的位置就是在序列化前修改数据。
- 常见错误:在数据库层或业务逻辑层硬编码替换(如把手机号写成
"138****1234"),导致同一份数据在不同接口中脱敏规则不一致、不可配置 - 正确做法:统一在
Context输出前做字段级过滤,支持按角色/场景开关
func maskSensitiveFields(data interface{}) interface{} {
// 使用 reflection 遍历结构体字段,检查是否带 `mask:"phone"`、`mask:"idcard"` 标签
v := reflect.ValueOf(data)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return data
}
<pre class="brush:php;toolbar:false;">t := reflect.TypeOf(data)
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
result := reflect.New(v.Type()).Elem()
for i := 0; i = 11 {
s := f.String()
result.Field(i).SetString(s[:3] + "****" + s[7:])
}
case "email":
if f.Kind() == reflect.String {
if idx := strings.Index(f.String(), "@"); idx > 0 {
s := f.String()
result.Field(i).SetString(s[:2] + "***@" + s[idx+1:])
}
}
}
}
return result.Interface()
}
然后在 handler 中:
ctx.JSON(iris.Map{
"code": 0,
"data": maskSensitiveFields(user),
})
注意:不要直接改原 user 变量,避免影响后续日志、审计等环节。
用自定义 JSON 序列化器替代全局 ctx.JSON()
Iris 允许注册自定义 JSON 编码器(通过 app.JSONEncoder),这样能一劳永逸地让所有 ctx.JSON() 自动脱敏。
- 优点:无需每个 handler 手动调用
maskSensitiveFields - 风险点:全局生效,可能误伤不需要脱敏的内部管理接口(如运维后台)
app.JSONEncoder = func(v interface{}) ([]byte, error) {
masked := maskSensitiveFields(v)
return json.Marshal(masked)
}
但要注意:这个编码器对所有 ctx.JSON() 生效,包括错误响应、调试接口。建议只对特定路由组启用,例如:
api := app.Party("/api/v1")
api.Use(func(ctx iris.Context) {
// 仅对 /api/v1 下的 JSON 响应做脱敏
oldEncoder := ctx.Application().JSONEncoder
ctx.Application().JSONEncoder = func(v interface{}) ([]byte, error) {
return json.Marshal(maskSensitiveFields(v))
}
ctx.Next()
ctx.Application().JSONEncoder = oldEncoder // 恢复,避免污染其他路由
})
脱敏规则必须和权限上下文联动,不能静态写死
真实业务中,“是否脱敏”取决于:
- 当前用户角色(如管理员可见完整身份证号,普通用户只能看后四位)
- 请求来源(App 端需脱敏,内部服务间调用不脱敏)
- 接口用途(导出 Excel 接口可能要求原始数据,而列表页必须脱敏)
所以别把 mask:"phone" 当成开关,而应设计成:
type User struct {
ID uint `json:"id"`
Name string `json:"name" mask:"name,role=admin"`
Phone string `json:"phone" mask:"phone,source=app"`
IDCard string `json:"id_card" mask:"idcard,export=false"`
}
解析标签时提取条件,结合 ctx.GetUser() 或 ctx.GetHeader("X-Source") 动态判断是否执行脱敏。
否则上线后你会发现:测试环境全脱敏了查不到问题,生产环境漏脱敏被通报——这种坑比代码 bug 更难定位。
脱敏不是加个星号就完事。真正的难点在于规则可配、行为可溯、不影响下游系统(比如审计日志必须留原始值)。Iris 给你的是管道,往里灌什么水、在哪个节点加过滤网,得你自己画清楚。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











