mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 06:47:20 +08:00
51 lines
1005 B
Go
51 lines
1005 B
Go
package rule
|
|
|
|
import (
|
|
"unicode"
|
|
|
|
"github.com/spf13/cast"
|
|
)
|
|
|
|
// Password 密码复杂度校验
|
|
type Password struct{}
|
|
|
|
func NewPassword() *Password {
|
|
return &Password{}
|
|
}
|
|
|
|
func (r *Password) Passes(val any, options ...any) bool {
|
|
password := cast.ToString(val)
|
|
// 不对空密码进行校验,有需要可以使用 required 标签
|
|
if password == "" {
|
|
return true
|
|
}
|
|
|
|
var hasUpper, hasLower, hasNumber, hasSpecial bool
|
|
if len(password) < 8 || len(password) > 20 {
|
|
return false
|
|
}
|
|
|
|
for _, char := range password {
|
|
switch {
|
|
case unicode.IsUpper(char):
|
|
hasUpper = true
|
|
case unicode.IsLower(char):
|
|
hasLower = true
|
|
case unicode.IsNumber(char):
|
|
hasNumber = true
|
|
case unicode.IsPunct(char) || unicode.IsSymbol(char):
|
|
hasSpecial = true
|
|
}
|
|
}
|
|
|
|
// 至少包含两类字符组合
|
|
valid := (hasUpper && hasLower) ||
|
|
(hasUpper && hasNumber) ||
|
|
(hasUpper && hasSpecial) ||
|
|
(hasLower && hasNumber) ||
|
|
(hasLower && hasSpecial) ||
|
|
(hasNumber && hasSpecial)
|
|
|
|
return valid
|
|
}
|