需求如下:
1.用户名长度:3-20;密码长度:10-20
2.密码不能包含用户名、空格,不能有连续且重复的字符如11、aa
3.不区分大小写检查禁止字符串
4.密码复杂度:四选三(即大写、小写字母、数字、符号至少包含三种)
2.关于不能有连续且重复的字符,这样写不对
在Java中,String.matches() 方法是用于判断整个字符串是否完全匹配正则表达式所描述的模式。因此,如果使用 password.matches("(.)\\\\1+"),它会尝试匹配整个密码字符串是否仅由连续且重复的字符组成。所以这里需要用Matcher类中的find()方法查找匹配项。
完整代码如下:
public String register(RegisterBody registerBody) {
String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword();
SysUser sysUser = new SysUser();
sysUser.setUserName(username);
if (StringUtils.isEmpty(username)) {
msg = "用户名不能为空";
} else if (StringUtils.isEmpty(password)) {
msg = "用户密码不能为空";
}
// 1.用户名长度:3-20;密码长度:10-20
else if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|| username.length() > UserConstants.USERNAME_MAX_LENGTH) {
msg = "账户长度必须在3到20个字符之间";
} else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
msg = "密码长度必须在10到20个字符之间";
} else if (!userService.checkUserNameUnique(sysUser)) {
msg = "保存用户'" + username + "'失败,注册账号已存在";
}
// 2.密码不能包含用户名、空格,不能有连续且重复的字符如11、aa
else if (password.contains(username)) {
msg = "密码不能包含账号";
} else if (password.contains(" ")) {
msg = "密码不能包含空格";
} else if (containsConsecutiveRepeats(password)) {
msg = "密码不能包含连续重复的数字或字母如11、aa";
}
// 3.不区分大小写检查禁止字符串
else if (true) {
String[] forbiddenStrings = {"wusite", "software", "industry"};
for (String forbidden : forbiddenStrings) {
if (password.toLowerCase().contains(forbidden))
msg = "密码中存在禁止字符串,请重新设置";
else break;
}
}
// 4.密码复杂性度:四选三
int complexityCount = 0;
if (password.matches(".*[a-z].*")) complexityCount++; // 包含小写字母
if (password.matches(".*[A-Z].*")) complexityCount++; // 包含大写字母
if (password.matches(".*\\d.*")) complexityCount++; // 包含数字
if (password.matches(".*[!@#$%^&*()_+<>?].*")) complexityCount++; // 包含符号
else if (complexityCount < 3)
{
msg = "密码中至少包含大写字母、小写字母、数字、符号中的三种";
}
else
{
sysUser.setNickName(username);
sysUser.setPassword(SecurityUtils.encryptPassword(password));
boolean regFlag = userService.registerUser(sysUser);
if (!regFlag)
{
msg = "注册失败,请联系系统管理人员";
}
else
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")));
}
}
return msg;
}
private boolean containsConsecutiveRepeats(String password) {
// 正则表达式,匹配任意字符的连续且重复
String regex = "(.)\\1+";
// 编译正则表达式
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(password);
// 查找匹配项
return matcher.find(); // 如果找到匹配项,则返回true
}
添加对账号密码安全性和规范性的检查,是为了保护用户隐私和维护系统稳定。