You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于go-playground/validator为不同枚举用户类型定制密码校验规则?

基于go-playground/validator实现差异化密码校验

可以实现,但原生tag无法直接根据枚举值分支校验,需要结合自定义校验函数和结构体tag来完成,以下是具体方案:

1. 编写自定义校验函数

创建一个校验函数,根据用户角色判断密码是否符合对应规则:

func passwordByRole(fl validator.FieldLevel) bool {
    // 获取当前校验的User结构体实例
    user, ok := fl.Parent().Interface().(User)
    if !ok {
        return false
    }
    password := fl.Field().String()

    switch user.Role {
    case "Admin":
        return len(password) >= 7
    case "Moderator":
        return len(password) >= 5
    case "Content creator":
        // 可根据需求设置内容创作者的密码规则,示例为至少4位
        return len(password) >= 4
    default:
        return false // 未知角色直接校验不通过
    }
}

2. 注册自定义校验器

在初始化validator时,将上面的函数注册为自定义校验规则:

v := validator.New()
if err := v.RegisterValidation("password_by_role", passwordByRole); err != nil {
    panic(err)
}

3. 更新结构体tag

给User结构体的Password字段添加自定义校验tag:

type User struct {
    Role     string `validate:"required,oneof=Admin Moderator Content creator"`
    Password string `validate:"required,password_by_role"`
}

4. 校验用户列表

接收用户列表后,逐个(或批量)调用校验方法:

// 示例用户列表
users := []User{
    {Role: "Admin", Password: "abc123"},    // 长度6,不符合Admin规则
    {Role: "Moderator", Password: "12345"}, // 长度5,符合规则
}

// 逐个校验
for _, u := range users {
    if err := v.Struct(u); err != nil {
        // 处理校验错误,比如打印或返回给客户端
        fmt.Printf("用户 %s 校验失败: %v\n", u.Role, err)
    }
}

// 批量校验(可选)
if err := v.Structs(users); err != nil {
    // 批量错误处理
}

关键说明

  • 自定义校验函数通过fl.Parent()获取结构体实例,从而拿到Role字段的值做分支判断
  • 可以在对应角色的case中扩展更复杂的规则(比如要求包含数字、特殊字符等)
  • oneof tag已经确保了Role只能是指定的枚举值,所以自定义函数里的分支覆盖所有合法情况

内容的提问来源于stack exchange,提问作者GrandQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:55:18