feat:改密

This commit is contained in:
waner
2026-04-25 10:37:19 +08:00
parent 1f7f67a2c7
commit 57ebf819a3
7 changed files with 94 additions and 40 deletions
@@ -11,7 +11,7 @@ public class AdminChangePasswordRequest {
private String oldPassword;
@NotBlank(message = "newPassword is required")
@Schema(description = "新口令", example = "中Abc1234")
@Schema(description = "新口令", example = "Abc1234!")
private String newPassword;
public String getOldPassword() {
@@ -13,7 +13,7 @@ public class ChangePasswordRequest {
private String oldPassword;
@NotBlank(message = "newPassword is required")
@Schema(description = "新口令", example = "中Abc1234")
@Schema(description = "新口令", example = "Abc1234!")
private String newPassword;
public String getOldPassword() {
@@ -5,41 +5,57 @@ import com.cisd.tms.common.exception.BizException;
public final class PasswordComplexityValidator {
public static final String MESSAGE = "密码复杂度不符合要求:需包含中文、英文、数字或特殊字符,长度不少于八位";
public static final String MESSAGE = "密码复杂度不符合要求:需由8到16位大小写字母、数字、符号组成,且三类均需包含";
private PasswordComplexityValidator() {
}
public static void validate(String password) {
String value = password == null ? "" : password;
if (value.length() < 8 || !containsChinese(value) || !containsEnglish(value) || !containsDigitOrSpecial(value)) {
if (value.isBlank()
|| value.length() < 8
|| value.length() > 16
|| !isAllowedCharacters(value)
|| !containsUppercase(value)
|| !containsLowercase(value)
|| !containsDigit(value)
|| !containsSymbol(value)) {
throw new BizException(ErrorCode.VALIDATE_FAILED.getCode(), MESSAGE);
}
}
private static boolean containsChinese(String value) {
return value.codePoints().anyMatch(codePoint -> Character.UnicodeScript.of(codePoint) == Character.UnicodeScript.HAN);
private static boolean isAllowedCharacters(String value) {
return value.codePoints().allMatch(codePoint ->
isAsciiLetter(codePoint) || isAsciiDigit(codePoint) || isSymbol(codePoint));
}
private static boolean containsEnglish(String value) {
return value.codePoints().anyMatch(codePoint ->
(codePoint >= 'A' && codePoint <= 'Z') || (codePoint >= 'a' && codePoint <= 'z'));
private static boolean containsUppercase(String value) {
return value.codePoints().anyMatch(codePoint -> codePoint >= 'A' && codePoint <= 'Z');
}
private static boolean containsDigitOrSpecial(String value) {
return value.codePoints().anyMatch(codePoint ->
Character.isDigit(codePoint) || isSpecial(codePoint));
private static boolean containsLowercase(String value) {
return value.codePoints().anyMatch(codePoint -> codePoint >= 'a' && codePoint <= 'z');
}
private static boolean isSpecial(int codePoint) {
return !Character.isWhitespace(codePoint)
&& !Character.isDigit(codePoint)
&& !isChineseOrEnglish(codePoint);
private static boolean containsDigit(String value) {
return value.codePoints().anyMatch(PasswordComplexityValidator::isAsciiDigit);
}
private static boolean isChineseOrEnglish(int codePoint) {
return Character.UnicodeScript.of(codePoint) == Character.UnicodeScript.HAN
|| (codePoint >= 'A' && codePoint <= 'Z')
|| (codePoint >= 'a' && codePoint <= 'z');
private static boolean containsSymbol(String value) {
return value.codePoints().anyMatch(PasswordComplexityValidator::isSymbol);
}
private static boolean isAsciiLetter(int codePoint) {
return (codePoint >= 'A' && codePoint <= 'Z') || (codePoint >= 'a' && codePoint <= 'z');
}
private static boolean isAsciiDigit(int codePoint) {
return codePoint >= '0' && codePoint <= '9';
}
private static boolean isSymbol(int codePoint) {
return codePoint >= 33 && codePoint <= 126
&& !isAsciiDigit(codePoint)
&& !isAsciiLetter(codePoint);
}
}